【问题标题】:What is the recommended way close IO resources declared as instance variables关闭声明为实例变量的 IO 资源的推荐方式是什么
【发布时间】:2016-11-15 07:01:29
【问题描述】:

在一些 Java 类中,我看到声明为实例变量的 IO 资源并在多个方法中使用。如何关闭它们?很少建议 finalize(),他们也说不推荐。我可以知道是否有更好的方法。 例如:

 public class test{
      private PrintWriter writer=null;
      public test(){
       createWriter();
}
      public void log(){
        writer.write("test");
        writer.flush();
      }
      public void createWriter(){
        writer=new PrintWriter(new BufferedWriter(new FileWriter("file")));
      }
    }

【问题讨论】:

  • 我只是像包装其他 Streams 和 Writers 的所有标准 Streams 和 Writers 一样:使该类实现 Closeable,因此有一个 close() 方法可以由 try-with 自动调用-资源声明。当然,还要记录下来。
  • 谢谢!这个问题来自具有大型代码库的现有项目。我是否需要在创建对象的任何地方更改(添加尝试),或者是否有任何其他方式可以关闭它而无需在此之外进行任何更改类。
  • 您不必强制使用 try-with-resources 语句。另一种方法是在 finally 块中关闭。但是在不更改代码的情况下,您无法做任何事情来神奇地调用 close()。
  • 知道了。谢谢。我想弄清楚我是否可以在不做任何更改的情况下做到这一点(比如添加 finalize() 或任何其他替代方法) .将继续尝试资源。再次感谢。:)

标签: java java-io finalize


【解决方案1】:

在您的类中实现AutoCloseable 并覆盖close() 方法并在此close() 方法中关闭所有与IO 相关的资源。

现在,如果您使用的是 Java 7,您可以使用 try with resource 创建对您的类的引用,JVM 将自动调用您的类的 close 方法。

正如你在FilterReader类的代码中看到的,

public abstract class FilterReader extends Reader {
    protected Reader in;
    //......Other code, and then
    public void close() throws IOException {
        in.close();
    }
}

如果你写了

try(FileReader fr = new FileReader("filename")){
    // your code
}

你完成了JVM会自动关闭它

【讨论】:

    【解决方案2】:

    应该有某种析构函数。例如在junit中(当你将你的类命名为“test”时)你有@AfterClass注释来在这种带注释的方法中进行清理。

    【讨论】:

      【解决方案3】:

      使用后手动关闭即可。

      public class PrintWriterDemo {
      private PrintWriter writer;
      public PrintWriterDemo() {
          writer = new PrintWriter(System.out);
      }
      public void log(String msg) {
          writer.write(msg + "\n");
          writer.flush();
      }
      
      public void close() {
          System.out.println("print writer closed.");
          writer.close();
      }
      
      public static void main(String[] args) {
          PrintWriterDemo demo = new PrintWriterDemo();
          demo.log("hello world");
          demo.close();
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-21
        • 1970-01-01
        • 1970-01-01
        • 2012-10-05
        • 2010-09-06
        • 1970-01-01
        相关资源
        最近更新 更多