Можно ли закрыть потоки методом, к которому они возвращаются? - PullRequest
0 голосов
/ 17 декабря 2018

Я работаю с устаревшим кодом, который открывает InputStream для файла, и мне любопытно, правильно ли закрывается поток.В настоящее время у нас есть метод, который возвращает InputStream, вызванный отдельным методом, который позже закрывает его:

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

Но я не уверен, правильно ли вызов doThing() закрывает все экземпляры InputStreamis.Я понимаю, что в методе doThing() экземпляр InputStream возвращается getStream() и правильно закрывается блоком finally.Эта часть ясна.

В чем я не уверен, так это в том, что метод getStream() порождает новый экземпляр InputStream, который не закрывается должным образом.

То есть, когда getStream() возвращает, возвращает ли ссылку на исходный объект is, или он возвращает новый экземпляр из is с тем же значением?

Если это первое, то я уверен, что метод doThing() закроет все потоки в файле.Хотя, если это последнее, то я обеспокоен тем, что, возможно, создал другой поток, который никогда явно не закрыт.Вместо этого объект будет просто помечен для удаления сборщиком мусора, который может или не может в конечном итоге избавиться от него.Я бы хотел этого избежать.

Все ли экземпляры is закрыты в конце doThing()?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Новые экземпляры создаются только ... new (*).Если вы не видите new, новый экземпляр не создается.

Таким образом, новый экземпляр не создается при возврате.При условии, что ничего не происходит, если в «1005 *» возникает исключение «делать что-то», вы закрываете это, вероятно, адекватным способом.

Лучшим способом будет использование try-with-resources, что делаеттщательная работа по сохранению исключений.


(*) Хорошо, да, есть некоторые конкретные случаи, когда это не совсем так, например, конкатенация строк.Конкатенация строк и автобокс.Конкатенация строк, автобокс и объявление массива.Я приду снова.

Но на самом деле отсутствие new является синтаксическим сахаром: где-то вызывается new.

0 голосов
/ 17 декабря 2018

Переменные, имеющие ссылочный тип, содержат только ссылку на базовое значение.Вы можете думать об этом как указатель.Передача ссылки между методами всегда передает только ссылку.

Итак, отвечая на ваш вопрос, ваш поток правильно закрыт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...