Fala pessoal,
soh queria fazer um comentario, quando vcs estao lendo arquivos binarios, ou seja, arquivos nao abertos corretamente pelo notepad (jpg, doc, bmp, mp3, dbf etc) vc nao deve utilizar nem Writers e Readers. Esses sao todos utilizados para streams de caracteres e nao de bytes.
O correto nesses casos eh utilizar InputStream e OutputStream, claro, vc pode utilizar os Buffereds que sao muito mais performaticos, mas NAO utilize readers e writers.
O comentario do KWill procede
porque quando se trabalha com caracteres dentro da jvm exite uma maluquice de convercoes entre ascii, unicode, utf8 etc e voce nao pode correr o risco de alterar um unico byte!!! :roll:
Assim, as vezes essas conversoes podem tirar alguns bytes que nao sao significativos para o caracter mas sao significaticos para o arquivo binario que pode aparecer corrmpido depois.
Armazena-los em Strings tb nao eh recomendavel, pois as strings tb fazem essas conversoes.
Um exemplo simpes seria, imaginem um caracter escrito em uma arquivo ascii, logo ele soh tem 8 bits, mas quando vc o poe em uma string java ele se torna unicode, passando a ter 16 bits (1 char java tem 16 bits, 2 bytes), ai dependendo de como vc trasnfira / armazene essa string depois ela pode armazenar como unicode, o que adiciona um byte em cada caracter.
Outro caso eh contrario, que eh muito comum, vc le um arquivo que tem caracters unicode, assim, cada caracter tem 2 bytes, logo, os caracteres comuns entre unicode e ascii tem os mesmo valores, mas o unicode tem que usar 2 bytes para representa-lo, onde, um byte tem apenas zeros agora, se vc o enviar por um processo UTF8 ele pode (vai) jogar fora os bytes nao necessarios durante a transferencia, assim mandando menos e ganhando performance o que eh uma boa coisa e normalmente nao traz problemas a arquivos texto, os editores atuais lidam bem com unicode e ascii, mas imagina a zona que pode virar um arquivo binario.
Agora, o que tem dentro de um arquivo binario?? Unicode ou ascii??
Na verdade nem um nem outro, cada formato de aquivo possui um sistema interno de controle, assim, cada byte pode ter um significado completamente maluco, como uma linha locada no DBF ou um controle dizendo qual a compactacado do JPEG.
Cedo ou tarde, mesmo setando o charset vc vai ter problemas com essas transferencias corrompendo os dbfs.
Complique muito??
Foi mal, soh tentando ajudar 
[]`s