Должен ли я закрыть FileOutputStream, который обернут PrintStream? - PullRequest
18 голосов
/ 10 ноября 2011

Я использую FileOutputStream с PrintStream, как это:

class PrintStreamDemo {  
    public static void main(String args[]) { 
        FileOutputStream out; 
        PrintStream ps; // declare a print stream object
        try {
            // Create a new file output stream
            out = new FileOutputStream("myfile.txt");

            // Connect print stream to the output stream
            ps = new PrintStream(out);

            ps.println ("This data is written to a file:");
            System.err.println ("Write successfully");
            ps.close();
        }
        catch (Exception e) {
            System.err.println ("Error in writing to file");
        }
    }
}

Я закрываю только PrintStream. Нужно ли также закрывать FileOutputStream (out.close();)?

Ответы [ 5 ]

25 голосов
/ 10 ноября 2011

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

Однако ваш код содержит один концептуальный сбой, закрытие должно произойти в finally, в противном случае он никогда не закрывается, когда код вызывает исключение между открытием и закрытием.

* 1006 Е.Г. *

public static void main(String args[]) throws IOException { 
    PrintStream ps = null;

    try {
        ps = new PrintStream(new FileOutputStream("myfile.txt"));
        ps.println("This data is written to a file:");
        System.out.println("Write successfully");
    } catch (IOException e) {
        System.err.println("Error in writing to file");
        throw e;
    } finally {
        if (ps != null) ps.close();
    }
}

(обратите внимание, что я изменил код на throw исключение, чтобы вы поняли причину проблемы, исключение, а именно содержит подробную информацию о причине проблемы)

Или, когда вы уже находитесь в Java 7, вы также можете использовать ARM (Автоматическое управление ресурсами; также известное как try-with-resources ), так что вам не нужно закрой что-нибудь сам:

public static void main(String args[]) throws IOException { 
    try (PrintStream ps = new PrintStream(new FileOutputStream("myfile.txt"))) {
        ps.println("This data is written to a file:");
        System.out.println("Write successfully");
    } catch (IOException e) {
        System.err.println("Error in writing to file");
        throw e;
    }
}
6 голосов
/ 10 ноября 2011

Нет, вот реализация PrintStream close() метода:

public void close() {
    synchronized (this) {
        if (! closing) {
        closing = true;
        try {
            textOut.close();
            out.close();
        }
        catch (IOException x) {
            trouble = true;
        }
        textOut = null;
        charOut = null;
        out = null;
        }
    }

Вы видите out.close();, который закрывает выходной поток.

4 голосов
/ 10 ноября 2011

Нет, вам не нужно. Метод PrintStream.close автоматически закрывает подчеркивающий выходной поток.

Проверьте API.

http://download.oracle.com/javase/6/docs/api/java/io/PrintStream.html#close%28%29

3 голосов
/ 10 ноября 2011

Нет, согласно javadoc, метод close закроет базовый поток для вас.

0 голосов
/ 10 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...