Вот пример, по которому у меня есть вопросы (он исходит из другого вопроса SO):
public static void writeToFile (final String filename)
{
PrintWriter out = null;
FileOutputStream fos = null;
try
{
fos = new FileOutputStream(filename);
out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(fos, "UTF-8")));
for (final String line : log)
{
out.println(line);
}
out.flush();
out.close();
}
catch (final Exception e)
{
System.err.println("Unable to write log to file.");
}
finally
{
if (fos != null)
{
try
{
fos.close();
}
catch (final IOException e)
{
System.err.println("Unable to write log to file.");
}
}
}
}
Теперь я думаю, что этот код работает нормально и освобождает все ресурсы там, где он должен, и т. Д. Мои вопросы:
Почему я должен закрывать FileOutputStream
в разделе finally
в try-catch-finally
? Конечно, я мог бы просто поместить код последовательно после try-catch
?
Почему я должен закрывать FileOutputStream
отдельно, а не просто заменять новым OutputStreamWriter (fos, .. .
с new OutputStreamWriter (new FileOutputStream (filename), ...
? Если я сначала закрою FileOutputStream, это автоматически закроет остальные и освободит ресурсы? Те же вопросы относятся к сокетам, если я закрываю соединение с сокетом, автоматически ли это закрывает читатели / записывающие потоки и освобождает ресурсы?
Мне неоднократно говорили, чтобы я читал и записывал потоки с "UTF-8" из-за того, что разные системы имеют разные кодировки (Или что-то вдоль этих линий). Применимо ли это по-прежнему при чтении / записи байтовых данных RAW (скажем, из нетекстового файла или в результате шифрования), поскольку я думал кодировки, где делать только текстовые символы?