Как избежать закрытия InputStream, переданного моему методу, который я обертываю в потоки Reader? - PullRequest
13 голосов
/ 12 июля 2010

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

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

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

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

Ответы [ 3 ]

10 голосов
/ 12 июля 2010

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

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

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

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

4 голосов
/ 12 июля 2010

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

3 голосов
/ 12 июля 2010

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

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

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

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

...