在某些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")));
}
}
答案 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();
}
}