2016-11-15 24 views
1

在一些Java類中,我看到IO資源被聲明爲實例變量,並且正在多個方法中使用。我如何關閉它們?很少建議finalize()和他們也說不推薦。我可否知道這是否有更好的方法? 例如:什麼是推薦的方式關閉IO資源作爲實例變量聲明

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"))); 
     } 
    } 
+4

我只是做像所有包裝其他Streams和Writers的標準Streams和Writer一樣:使類實現爲Closeable,並因此具有close()方法,該方法可以通過try-with-resources語句自動調用。當然,這是文件。 –

+0

謝謝!這個問題來自於一個具有大代碼基礎的現有項目。我是否需要在創建對象的任何地方更改(添加try-with),或者有任何其他方式可以通過它關閉它,而無需在此之外進行任何更改類。 – Saikiran

+0

您不必強制使用try-with-resources語句。另一種方法是在finally塊中關閉。但是沒有任何事情可以在不改變代碼的情況下使代碼調用close()變得很神奇。 –

回答

0

這裏應該是某種析構函數。例如,在你命名你的類「測試」的時候,你有@AfterClass註釋來完成這種註釋方法的清理工作。

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

}

1

器具AutoCloseable在你的類並覆蓋close()方法並關閉所有IO相關資源在此close()方法。

現在,如果您使用的是Java 7,則可以使用資源嘗試創建對您的類的引用,並且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會自動關閉它

相關問題