2014-01-16 8 views
3

мой первый вопрос на StackOverflow, я вышел;)закрытия потока цепи и попробовать-с ресурсом

При использовании потока цепи это обычно хорошо pratice просто закрыть последний поток в цепи, так близко () должна распространяться через все потоки цепи.

Что считается хорошей практикой при объединении утверждений try-with-ressource и последовательности потоков?

а) Создание всех потоков внутри Ьгу заявления:

try (InputStream processIn = p.getInputStream(); 
      InputStreamReader inReader = new InputStreamReader(processIn); 
      BufferedReader input = new BufferedReader(inReader)) { 
    . 
    . 
} 

или б) только последний член цепи:

InputStream processIn = p.getInputStream(); 
InputStreamReader inReader = new InputStreamReader(processIn); 
try (BufferedReader input = new BufferedReader(inReader)) { 
    . 
    . 
} 

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

ответ

3

Хорошая практика - вариант a).

Если вы используете опцию b), то если инициализация потока inReader не удалась, тогда поток processIn не будет закрыт.

С другой стороны, если вы используете опцию а), то каждый поток будет закрыт правильно. Конечно, если вы связываете потоки, тогда первый поток в цепочке может быть попытен к закрытию несколько раз, но это нормально для потоков, потому что все они реализуют Closeable, что требует, чтобы метод close() был идемпотентным (т.е. если поток уже был закрыто, то дополнительные вызовы close() не должны иметь эффекта).

Дополнительная информация here и here.

+0

Я не рассматривал возможную проблему инициализации. Все, кто читает это, также должны прочитать вашу вторую ссылку, описывающую подобную проблему. Оба случая довольно очевидны, когда вы об этом думаете, но их легко упускать из виду. Спасибо за подсказки! – Johnson

 Смежные вопросы

  • Нет связанных вопросов^_^