Arquivo - ler um byte por vez sem precisar saber o tamanho total de caracteres

4 respostas
A

Pessoal, já havia perguntado isso aqui (e obtive resposta), mas o tópico sumiu :roll: . Como não salvei e não encontrei na net, me resta perguntar novamente:

Como ler um byte por vez de um arquivo sem precisar saber o tamanho do mesmo?

Ler byte a byte eu sei, o problema é não posso usar o tamanho do mesmo para saber se já acabou ou não a leitura.

É que estou lendo arquivos bem grandes, cujo tamanho não cabe em um inteiro.

Vou dar um exemplo, eu uso isso:
DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(caminhoDoArquivo)));
		        
while (in.available() != 0) {
mas como podem ver, vai trancar tudo pois o in guarda a quantidade de dígitos do arquivo, e meu arquivo tem muito mais que [telefone removido] dígitos. Tentei criar uma "gambiarra" do tipo: Se byte for null, parar mas não funcionou.

Alguém lembra como se faz isso?
Muito Obrigado!

4 Respostas

E

Tio, pra começar nunca leia “1 byte de cada vez”. Nem use o método “available”.
O método mais rápido para ler um arquivo com FileInputStream é, para começar, encapsulá-lo com um BufferedInputStream (e se quiser, use um buffer bem grande, em vez do buffer default de 8KB que BufferedInputStream tem). E depois, você pode escolher entre ler um array de bytes de cada vez (normalmente preferido) ou , se seu caso é realmente ler 1 byte de cada vez (argh - bleargh - ugh - vômito), usar o método read(), que retorna -1 se o fim do arquivo foi alcançado, e um inteiro de +0 até +255 (que corresponde a 1 byte de 0 até 255) se ele leu um byte.

dyorgio

é facil cara, apenas use o read() do seu inputStream…

assim :

int ultimoByte = -1;
while ((ultimoByte = inputStream.read())!= -1){
  // faz um cast basico
  byte seuByte = (byte)ultimoByte;
}
A

entanglement:
Tio, pra começar nunca leia “1 byte de cada vez”. Nem use o método “available”.
O método mais rápido para ler um arquivo com FileInputStream é, para começar, encapsulá-lo com um BufferedInputStream (e se quiser, use um buffer bem grande, em vez do buffer default de 8KB que BufferedInputStream tem). E depois, você pode escolher entre ler um array de bytes de cada vez (normalmente preferido) ou , se seu caso é realmente ler 1 byte de cada vez (argh - bleargh - ugh - vômito), usar o método read(), que retorna -1 se o fim do arquivo foi alcançado, e um inteiro de +0 até +255 (que corresponde a 1 byte de 0 até 255) se ele leu um byte.

Tudo bem, vamos lá então. Será que rola um exemplo (sem precisar saber o tamanho)?

vlw

dyorgio

meu posta cara…ta exemplificado.

Criado 10 de março de 2010
Ultima resposta 11 de mar. de 2010
Respostas 4
Participantes 3