Как избежать закрытия InputStream, переданного моему методу, который я переношу в потоки чтения?

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

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

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

Кто-нибудь видит способ закрыть те BufferedReader и InputStreamReader, которые я создал, не закрывая InputStream, переданный моему методу? Может быть, есть способ сделать копию предоставленного InputStream, прежде чем я его завершу? Благодаря

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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