我正在使用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();
)?
答案 0 :(得分:25)
不,您只需要关闭最外层的流。它将一直委托给包装的流。
但是,您的代码包含一个概念性失败,关闭应该在finally
中发生,否则当代码在打开和关闭之间抛出异常时它永远不会关闭。
E.g。
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();
}
}
(请注意,我将代码更改为抛出异常,以便您了解问题的原因,异常即包含有关问题原因的详细信息)
或者,当您已经使用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;
}
}
答案 1 :(得分:5)
不,这是PrintStream
的{{1}}方法的实现:
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;
}
}
。
答案 2 :(得分:4)
不,你不需要。 PrintStream.close方法自动关闭下划线输出流。
检查API。
http://download.oracle.com/javase/6/docs/api/java/io/PrintStream.html#close%28%29
答案 3 :(得分:3)
不,根据javadoc,close方法将close为您提供基础流。
答案 4 :(得分:-1)
不。不需要关闭其他组件。当您关闭流时,它会自动关闭其他相关组件。