关闭IO资源声明为实例变量的建议方法是什么

时间:2016-11-15 07:01:29

标签: java java-io finalize

在某些Java类中,我看到IO资源被声明为实例varibles并且正在多个方法中使用。如何关闭它们?很少有人建议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")));
      }
    }

3 个答案:

答案 0 :(得分: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会自动关闭它

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您只需在使用后手动关闭它。

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();
}

}