Onde está o fis.close(), indicado por <-----, quando executo o programa, tenho, ao final da execução, leEntrada() é o último método chamado por main,
a mensagem (não é de erro) "Stream closed" em vez dos dados recuperados.
Se comento o fis.close(), desativando-o, o programa lê os dados do arquivo gravado e os exibe como deveria ser.
Mas o Eclipse dá o alerta de que o arquivo não fecha nunca.
Se ponho ele em qualquer outro lugar, vem o erro de que fis.close() não se resolve, pelo que entendo, não acha a declaração da variável fis.
Assim, faço a pergunta, como se resolve isso? Qual é o lugar dele?
Onde está o fis.close(), indicado por <-----, quando executo o programa, tenho, ao final da execução, leEntrada() é o último método chamado por main,
a mensagem (não é de erro) "Stream closed" em vez dos dados recuperados.
Se comento o fis.close(), desativando-o, o programa lê os dados do arquivo gravado e os exibe como deveria ser.
Mas o Eclipse dá o alerta de que o arquivo não fecha nunca.
Se ponho ele em qualquer outro lugar, vem o erro de que fis.close() não se resolve, pelo que entendo, não acha a declaração da variável fis.
Assim, faço a pergunta, como se resolve isso? Qual é o lugar dele?
Obrigado.
Cara de boa, tenta usar além do try catch o seu finally... assim mesmo que ele esteja travando ao abrir ou no meio de uma leitura ele sempre fechará o arquivo. Blz... fica assim seu código:
publicvoidleEntrada(){Filearquivo=newFile("C:\\pet\\entrada.txt");try{FileInputStreamfis=newFileInputStream(arquivo);//fis.close(); <------- comenta essa linha aqui... usa lá em baixo!intlin;while((lin=fis.read())!=-1){System.out.print((char)lin);}}catch(IOExceptione){System.out.print(e.getMessage());}finally{fis.close();}//Usa aqui macho!hehehehe}
Outra coisa boa seria usar um if pra ter certeza de que o objeto fis realmente carrega algo.
ex:
if(fis!=null){fis.close();} //manda ver!
J
joagostini
Olá jacobis
Valeu. Ajudou-me a entender melhor o finally.
Mas acabei por testar a sugestão e deu o mesmo resultado:
“fis cannot be resolved”
Parece que ele não pode sair do try.
ViniGodoy
E não mesmo, é uma questão básica de escopo. Para usar no finally, você deve declara-lo antes:
public void leEntrada (){
File arquivo = new File("C:\\pet\\entrada.txt");
FileInputStream fis = null;
try {
fis= new FileInputStream(arquivo);
int lin;
while((lin=fis.read())!=-1){
System.out.print((char)lin);
}
} catch(IOException e) {
throw new RuntimeException(e);
}finally{
if (fis != null) try { fis.close(); } catch (Exception e) {}
}
}
Se estiver usando o Java 7, pode usar o try with resources, que simplifica muito esse código:
public void leEntrada (){
File arquivo = new File("C:\\pet\\entrada.txt");
try (FileInputStream fis = new FileInputStream(arquivo)) {
int lin;
while((lin=fis.read())!=-1){
System.out.print((char)lin);
}
} catch(IOException e) {
throw new RuntimeException(e);
}
}
Note que com o try with resources não é necessário mais colocar o finally ou chamar o close. O Java fará isso sozinho.