Я работаю с устаревшим кодом, который открывает 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()
?