Fechamento de fluxos

11 respostas
C

O livro dá o seguinte exemplo:

public static void main(String[] args)
{
  Box myBox = new Box();

  try
  {
    FileOutputStream fs = new FileOutputStream("foo.ser");
    ObjectOutputStream os = new ObjectOutputStream(fs);
    os.writeObject(myBox);
    os.close();
  }
  catch(Exception ex)
  {
    ex.printStackTrace();
  }
}

E o fs.close? Não precisa?
Por que?

11 Respostas

drsmachado

Você pode incluir o fs.flush() e fs.close() sem problemas.
A questão dos livros é que cada autor coloca o que acha relevante…

Eric_Yuzo

Não é obrigatório porque o método close() de ObjectOutputStream (os) já invoca o método close() do OutputStream (fs) carregado pelo construtor.

Só uma dica: é interessante colocar a chamada para o método close em um bloco finally, assim terá certeza que o os será fechado.

C
public static void main(String[] args)  
{  
  Box myBox = new Box();  
  
  try  
  {  
    FileOutputStream fs = new FileOutputStream("foo.ser");  
    ObjectOutputStream os = new ObjectOutputStream(fs);  
    os.writeObject(myBox);    
  }  
  catch(Exception ex)  
  {  
    ex.printStackTrace();  
  }  
  finally
  {
    os.close();
  }
}

Isso era pra funcionar?
Aqui dá erro... :?

Eric_Yuzo
As variáveis criadas dentro de um bloco, existem apenas dentro deste bloco. É o caso de os, que está sendo criado no bloco do try.
public static void main(String[] args)  
{  
  Box myBox = new Box();  

  ObjectOutputStream os = null; //Agora "os" existirá em qualquer parte do método main

  try  
  {  
    FileOutputStream fs = new FileOutputStream("foo.ser");  
    os = new ObjectOutputStream(fs);  
    os.writeObject(myBox);    
  }  
  catch(Exception ex)  
  {  
    ex.printStackTrace();  
  }  
  finally {
    if (os != null)
        try { os.close(); }
        catch (IOException ex) { }
  }
}
C

Então como faz?

Eric_Yuzo

Um post acima tem o exemplo.

C

Ops! Malz! :XD:
Vlw! =]

C

Ainda tá dando erro… :?

Eric_Yuzo

O os.close() deve estar em um bloco try/catch, pois ele declara IOException. Copiei e colei o código e acabei nem percebendo.

finally { if (os != null) try { os.close(); } catch (IOException ex) { } }
Edit: Arrumei o exemplo lá em cima também.

C

Então se a Exception for lançada no construtor do ObjectOutputStream, FileOutputStream ficará aberto?

Eric_Yuzo

Imagino que sim. Do jeito que está, quem chama o close de fs é o método close de os. Por isso não custa nada fechar tudo na mão mesmo.

Criado 23 de novembro de 2010
Ultima resposta 23 de nov. de 2010
Respostas 11
Participantes 3