Я создаю метод Java, который принимает сингл InputStream
как аргумент. Для удобства работы с символьно-ориентированным потоком я переношу обеспеченный InputStream
в начале реализации метода следующим образом:
public void doStuff(InputStream inStream) {
BufferedReader reader = new BufferedReader(new InputStreamReader(inStream));
...
}
Начиная с InputStream
(inStream
) передается моему методу, я не хочу закрывать его..., поскольку я думаю, что это должно быть ответственностью клиента, называющего мой метод (это предположение корректно?). Однако я действительно думаю, что должен закрыться BufferedReader
то, что я создал; но при этом, я полагаю, что это автоматически закроет все другие составленные потоки включая inStream
.
Делает любой видит способ для меня закрыться BufferedReader
и InputStreamReader
то, что я создал, не закрываясь InputStream
переданный моему методу? Возможно, существует способ сделать копию обеспеченного InputStream
прежде чем я перенесу его?Спасибо
Вам не нужно закрывать BufferedReader
или InputStreamReader
или, вероятно, большинство реализаций ридеров, если вы не хотите закрывать базовый ридер.
Эти считыватели не содержат никаких ресурсов, которые вызов close()
сделает свободными и которые сборщик мусора не освободит в любом случае (например, собственные ресурсы или значения в статических переменных), когда вы удалите ссылку на считыватель в конце вашего метода.
Базовые потоки ввода, которые связываются с родными ресурсами, например, FileInputStream
или потоки, полученные из URL, должны быть закрыты, чтобы освободить эти родные ресурсы.
Для Writer
есть разница в том, что close()
обычно вызывает flush()
. Но затем вы можете вызвать flush()
напрямую.
Лично я бы просто избежал проблемы, изменив сигнатуру вашего метода так, чтобы он требовал передачи BufferedReader (или Reader).
Я бы попробовал переопределить метод close
:
BufferedReader reader = new BufferedReader(new InputStreamReader(inStream)){
public void close() throws IOException {
synchronized (lock) {
if (in == null)
return;
}
}
};
// rest of your code
Довольно безумно, но он должен работать. Хотя я не уверен, что это лучший подход.
Я думаю, что это интересный вопрос, поэтому я надеюсь, что кто-то из экспертов выскажет свое мнение.