Onde inserir o close() em sequência ao FileInput

Olá

No programinha que estou escrevendo tenho este método:

[code]public void leEntrada (){
File arquivo = new File("C:\pet\entrada.txt");
try {
FileInputStream fis= new FileInputStream(arquivo);
fis.close(); <-------
int lin;
while((lin=fis.read())!=-1){
System.out.print((char)lin);
}

	}
catch(IOException e){
      System.out.print(e.getMessage());
    }

}[/code]

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.

[quote=joagostini]Olá

No programinha que estou escrevendo tenho este método:

[code]public void leEntrada (){
File arquivo = new File("C:\pet\entrada.txt");
try {
FileInputStream fis= new FileInputStream(arquivo);
fis.close(); <-------
int lin;
while((lin=fis.read())!=-1){
System.out.print((char)lin);
}

	}
catch(IOException e){
      System.out.print(e.getMessage());
    }

}[/code]

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.
[/quote]

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:

[code]public void leEntrada (){
File arquivo = new File("C:\pet\entrada.txt");
try {
FileInputStream fis= new FileInputStream(arquivo);
//fis.close(); <------- comenta essa linha aqui… usa lá em baixo!
int lin;
while((lin=fis.read())!=-1){
System.out.print((char)lin);
}

	}
catch(IOException e){
      System.out.print(e.getMessage());
    }finally{      fis.close();       }//Usa aqui macho!hehehehe

}[/code]

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!

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.

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.