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

3 respostas
J

Olá

No programinha que estou escrevendo tenho este método:

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());
	    }
	
}

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.

3 Respostas

jacobis
joagostini:
Olá

No programinha que estou escrevendo tenho este método:

public void leEntrada (){
	File arquivo = new File(&quot;C:\\pet\\entrada.txt&quot;);
	try {
	FileInputStream fis= new FileInputStream(arquivo);
	fis.close(); &lt;-------
	int lin;
	while((lin=fis.read())!=-1){
		System.out.print((char)lin);
	}
	
		}
	catch(IOException e){
	      System.out.print(e.getMessage());
	    }
	
}

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:

public void leEntrada (){
	File arquivo = new File(&quot;C:\\pet\\entrada.txt&quot;);
	try {
	FileInputStream fis= new FileInputStream(arquivo);
	//fis.close(); &lt;-------     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
	
}
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

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.

Criado 18 de agosto de 2012
Ultima resposta 19 de ago. de 2012
Respostas 3
Participantes 3