Fechamento de fluxos

O livro dá o seguinte exemplo:

[code]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();
}
}[/code]

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

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

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.

[code]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();
}
} [/code]

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

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.

[code]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) { }
}
} [/code]

Então como faz?

Um post acima tem o exemplo.

Ops! Malz! :XD:
Vlw! =]

Ainda tá dando erro… :?

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.

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

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.