Как я стараюсь не закрываться, InputStream передал моему методу, который я переношу в потоки Читателя?

Я создаю метод Java, который принимает сингл InputStream как аргумент. Для удобства работы с символьно-ориентированным потоком я переношу обеспеченный InputStream в начале реализации метода следующим образом:

public void doStuff(InputStream inStream) {
   BufferedReader reader = new BufferedReader(new InputStreamReader(inStream));
   ...
}

Начиная с InputStream (inStream) передается моему методу, я не хочу закрывать его..., поскольку я думаю, что это должно быть ответственностью клиента, называющего мой метод (это предположение корректно?). Однако я действительно думаю, что должен закрыться BufferedReader то, что я создал; но при этом, я полагаю, что это автоматически закроет все другие составленные потоки включая inStream.

Делает любой видит способ для меня закрыться BufferedReader и InputStreamReader то, что я создал, не закрываясь InputStream переданный моему методу? Возможно, существует способ сделать копию обеспеченного InputStream прежде чем я перенесу его?Спасибо

13
задан Harry Johnston 2 May 2014 в 01:33
поделиться

3 ответа

Вам не нужно закрывать BufferedReader или InputStreamReader или, вероятно, большинство реализаций ридеров, если вы не хотите закрывать базовый ридер.

Эти считыватели не содержат никаких ресурсов, которые вызов close() сделает свободными и которые сборщик мусора не освободит в любом случае (например, собственные ресурсы или значения в статических переменных), когда вы удалите ссылку на считыватель в конце вашего метода.

Базовые потоки ввода, которые связываются с родными ресурсами, например, FileInputStream или потоки, полученные из URL, должны быть закрыты, чтобы освободить эти родные ресурсы.

Для Writer есть разница в том, что close() обычно вызывает flush(). Но затем вы можете вызвать flush() напрямую.

10
ответ дан 1 December 2019 в 23:47
поделиться

Лично я бы просто избежал проблемы, изменив сигнатуру вашего метода так, чтобы он требовал передачи BufferedReader (или Reader).

4
ответ дан 1 December 2019 в 23:47
поделиться

Я бы попробовал переопределить метод close :

BufferedReader reader = new BufferedReader(new InputStreamReader(inStream)){
    public void close() throws IOException {
        synchronized (lock) {
            if (in == null)
                return;
        }
    }
};
// rest of your code

Довольно безумно, но он должен работать. Хотя я не уверен, что это лучший подход.

Я думаю, что это интересный вопрос, поэтому я надеюсь, что кто-то из экспертов выскажет свое мнение.

3
ответ дан 1 December 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: