2013-05-16 5 views
9

Рассмотрим BufferedReader, как показано ниже:Нужно ли закрывать FileWriter, если он написан через BufferedWriter?

writer = new BufferedWriter(new FileWriter(new File("File.txt"), true)); 

В этом случае в конце приложения, я закрывании writer с writer.close()

этого будет достаточно? Разве не будет создан файл FileWriter с new FileWriter(new File("File.txt"), true)?

ответ

12

Не нужно закрывать его, потому что BufferedWriter заботится о закрытии писателя, который он обертывает.

Чтобы убедить вас, что это исходный код близкого метода BufferedWriter:

public void close() throws IOException { 
    synchronized (lock) { 
     if (out == null) { 
      return; 
     } 
     try { 
      flushBuffer(); 
     } finally { 
      out.close(); 
      out = null; 
      cb = null; 
     } 
    } 
} 
+5

[Линия 'out.close();' отсутствует) (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25 /java/io/BufferedWriter.java?av=f#259) в Java 8 'BufferedWriter' – Mihai

+5

@ A.Roshenko внимательно посмотрите, блок' try' был заменен блоком 'try-with' в java 8 BufferedReader. То же самое, основной писатель все еще закрывается и в java 8. –

2

Да writer.close() закрывает основные авторы/потоки.

2

Лучше закрыть весь открытый поток индивидуален, все отдельный поток. Если во вложенном потоке произошла ошибка, поток не будет близок. Так что лучше всего закрыть каждый вложенный поток.

Для получения более подробной информации обратитесь по следующей ссылке:

Correct way to close nested streams and writers in Java

+0

Спасибо за ссылку в этом вопросе. Но я не согласен с тем, что лучше закрыть и внутренних авторов, потому что: 0). Окончательный пункт (как вы видите в моем ответе) гарантирует, что метод закрытого внутреннего писателя называется 2) В (редком) случае, out.close() может генерировать исключение, переменные-члены автора и cb не имеют значения null, что не представляет проблемы, поскольку они являются обычными объектами (а не системными ресурсами, например, файлом) – sambe

1

Вам нужно закрыть только самые внешние потоки. остальные потоки являются временными и будут автоматически закрыты. если вы создаете потоки отдельно, а затем вставляете их, в этом случае вам нужно закрыть отдельный поток. Проверьте этот вопрос также Correct way to close nested streams and writers in Java

+0

Нет, вы не «нужно закрыть отдельный поток [s]». Вам нужно только закрыть внешний поток. – EJP

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