Closing streams/sockets and try-catch-finally

Вот пример, по которому у меня есть вопросы (он исходит из другого вопроса 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.");
            }
        }
    }
}

Теперь я думаю, что этот код работает нормально и освобождает все ресурсы там, где он должен, и т. Д. Мои вопросы:

  1. Почему я должен закрывать FileOutputStream в разделе finally в try-catch-finally ? Конечно, я мог бы просто поместить код последовательно после try-catch ?

  2. Почему я должен закрывать FileOutputStream отдельно, а не просто заменять новым OutputStreamWriter (fos, .. . с new OutputStreamWriter (new FileOutputStream (filename), ... ? Если я сначала закрою FileOutputStream, это автоматически закроет остальные и освободит ресурсы? Те же вопросы относятся к сокетам, если я закрываю соединение с сокетом, автоматически ли это закрывает читатели / записывающие потоки и освобождает ресурсы?

  3. Мне неоднократно говорили, чтобы я читал и записывал потоки с "UTF-8" из-за того, что разные системы имеют разные кодировки (Или что-то вдоль этих линий). Применимо ли это по-прежнему при чтении / записи байтовых данных RAW (скажем, из нетекстового файла или в результате шифрования), поскольку я думал кодировки, где делать только текстовые символы?

5
задан Jonathon Faust 17 May 2011 в 14:59
поделиться