8
在try-with-resources块中管理多个链接资源的正确习惯吗?
仅使用一种资源时,Java 7 try-with-resources语法(也称为ARM块(自动资源管理))非常好,简短而直接AutoCloseable。但是,当我需要声明相互依赖的多个资源时(例如a FileWriter和a BufferedWriter将其包装),我不确定什么是正确的习惯用法。当然,这个问题涉及AutoCloseable包装某些资源的任何情况,而不仅仅是这两个特定的类。 我提出了以下三种选择: 1) 我见过的天真习惯是在ARM管理的变量中只声明顶层包装器: static void printToFile1(String text, File file) { try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) { bw.write(text); } catch (IOException ex) { // handle ex } } 这很不错,也很简短,但是坏了。因为底层FileWriter没有在变量中声明,所以它永远不会在生成的finally块中直接关闭。只能通过close包装方法将其关闭BufferedWriter。问题是,如果从bw的构造方法中引发了异常,close则不会调用该异常,因此基础层FileWriter 也不会关闭。 2) static void printToFile2(String text, File file) { try (FileWriter fw = new FileWriter(file); …