Ответ 1
Нет, вам нужно только закрыть внешний поток. Он будет делегировать весь путь к завернутым потокам.
Однако ваш код содержит один концептуальный сбой, закрытие должно происходить в finally
, иначе оно никогда не закрывается, когда код генерирует исключение между открытием и закрытием.
например.
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;
}
}