Streams pode ser fechada pelo método eles retornam para?

Lord Farquaad:

Eu estou trabalhando com código legado que abre um InputStream para um arquivo, e estou curioso se o fluxo está sendo fechada. O que temos atualmente é um método que retorna um InputStream invocado por um método separado que depois fecha-lo:

public void doThing(String path) throws Exception {

   InputStream is = getStream(path);

   try {
       ...   // Do some stuff
   } finally {
       if(is != null)
           is.close();
   }
}

public InputStream getStream(String path) throws Exception {

    InputStream is = new FileInputStream(new File(path));
    ...     // Do some stuff
    return is;
}

Mas eu não estou certo se uma chamada para doThing()fecha corretamente todas as instâncias do InputStream is. Eu entendo que, dentro do doThing()método, uma instância do InputStream é devolvido pelo getStream(), e está devidamente fechada pelo finallybloco. Essa parte é clara.

O que eu não estou certo de se é ou não as getStream()desovas método uma nova instância do InputStream que não está bem fechada.

Ou seja, quando getStream()retorna, ele é retornar uma referência ao objeto original is, ou está retornando uma nova instância de iscom o mesmo valor?

Se for o primeiro, então estou confiante de que o doThing()método irá ter fechado qualquer e todos os fluxos para o arquivo. Se ele é o último, porém, então eu estou preocupado que eu possa ter criado um outro fluxo que nunca é fechada explicitamente. Em vez disso, o objeto seria apenas ser marcado para exclusão pelo coletor de lixo, que pode ou não pode, eventualmente, se livrar dele. Eu gostaria de evitar isso.

São todas as instâncias do isfechado no final de doThing()?

Andy Turner:

Novas instâncias são criadas apenas por ... new(*). Se você não ver um newlá, não há uma nova instância que está sendo criado.

Assim, nenhuma nova instância é criada pelo retorno. Desde que nada acontece que lança uma exceção no "fazer alguma coisa" em getStream, você está fechando isso de uma maneira adequada provável.

A melhor maneira seria usar try-com-recursos, que faz um trabalho mais aprofundado de preservar exceções.


(*) Ok, sim, existem alguns casos específicos em que isso não é bem verdade, para concatenação exemplo string. concatenação e autoboxing. concatenação, autoboxing e declaração de matriz. Eu vou entrar novamente.

Mas, na verdade, a falta de newé açúcar sintático: em algum lugar, um newestá sendo invocado.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=200125&siteId=1
Recomendado
Clasificación