Tenho uma arquivo texto no C:\, que preciso ler usando um stream. O método abaixo nao funciona, deixando um loop infinito. Mandei mostrar o offset, que deveria ser incrementado a cara leitura o metodo read, ele simplesmente nao sai do canto, fica sempre em zero. O que pode ser? Eu não entendo muito de streams…
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package inputoutputstream;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
/**
*
* @author owner
*/
public class AosPoucos {
public static void main(String[] args) {
try {
// link para um arquivo no disco...
File file = new File("C:\\testeStream.txt");
// um inpuStream para o arquivo...
FileInputStream is = new FileInputStream(file);
// byte onde sera armazenada a leitura...
byte[] bytes = new byte[(int)file.length()];
// variaveis auxiliares para o processo de leitura...
int offset = 0;
int numRead = 0;
// enquanto nao retorna -1, leia!
while ((numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
offset += numRead;
}
// so para saber se chegou ao final da leitura...
System.out.println("n = " + numRead + ", l = " + file.length());
// Ensure all the bytes have been read in
if (offset < bytes.length) {
throw new IOException("Could not completely read file " + "Arquivo");
}
// mostra em tela o que foi lido
System.out.println(new String(bytes));
} catch (Exception e) {
}
}
}
O que eu quero é usar um Stream e ler uma determinada quantidade de bytes, depois que ler, testar se leu tudo. Se nao leu, ler mais bytes, ate chegar no fim. O metodo numRead=is.read(bytes, offset, bytes.length-offset) me dá esse controle. Caso retorne -1, entao é porque chegou no final do buffer e tudo foi lido.
Usei isso num pdf (esse metodo que eu usei) da internet e funcionou. Agora que estou usando num txt local do disco, nao funciona. Estou fazendo uns testes aqui. O que eu quero é que eu POSSA ver e controlar a leitura, entende? tipo… Poderia ser assim como eu falei (leio, verifico que chegou ao fim. Se sim, imprimo na tela, se nao, leio mais).
Ou entao, poderia ser lendo a cada 5 bytes (5 chutei essa quantidade de bytes, o que eu queria é ter uma quantidade de bytes que EU especifique, que eu possa dizer a quantidade).
Resumindo…
Eu quero uma forma em que eu possa controlar a quantidade de bytes lidos, ao inves de fazer de modo automatico. Espero ter sido claro.
*Modo automatico que eu falo é apenas iterando como no br.readline() == null, eu quero ver os numeros, entende? Nao é bem “automatico”, sei la como falar isso… Mas deu pra entender, ne (rsrsrs)?
E desde já, obrigado pela ajuda, amigo! Valeu mesmo!
Ah, entendi.
Você quer algo semelhante ao utilitário “tail” do Unix (opção -f), que permite visualizar as últimas N linhas de um arquivo que está sendo escrito por um outro programa.
Um exemplo de programa Windows que faz a mesma coisa é o BareTail, http://baremetalsoft.com/baretail/
Nesse caso, costuma-se usar RandomAccessFile, não FileInputStream.