我目前在java中做这样的事情来释放资源。我是否需要在BufferedWriter对象上调用close或者在析构函数中调用它?关于Resource1和Resource2,我必须尊重发布和免费。这是嵌套trys的正确方法吗? Python有一个非常好的“with statement”,它将资源与代码范围相关联。 java有喜欢吗?
Resource1 r1 = new Resource1();
try
{
...
Resource2 r1 = new Resource2();
try
{
...
java.io.BufferedWriter f = new java.io.BufferedWriter(new java.io.FileWriter(new java.io.File("f")));
try
{
...
}
finally
{
f.close();
}
}
finally
{
r2.release();
}
}
finally
{
r1.free();
}
更新 我正在使用Java 1.6
答案 0 :(得分:3)
您对BufferedWriter
的看法是正确的。
但是,您可能希望吞下close期间发生的任何异常。这很烦人但很必要。通常使用以下模式:
BufferedWriter f = null;
try {
f = new BufferedWriter(...);
...
}
finally {
try {
if(f != null) {
f.close();
}
}
catch(IOException e) {
// Nothing can be done, except maybe log it.
}
}
IOUtils.finallyClose()可用于消除关闭时捕获的需要。
Java doesn't quite have析构函数的概念,但它确实有finalize()在对象被垃圾收集时调用。您应该从不依靠finialize()
关闭或以其他方式清理对象。
顺便说一下,Java 7 introduced是关闭实现Closeable的对象的更短语法。
try (BufferedWriter f = new BufferedWriter(new FileWriter(new File("f"))) {
...
}
编辑:我最终扩展了......关闭。
答案 1 :(得分:2)
您需要自己关闭文件句柄和其他类似的资源。依靠终结器来做这件事是一种糟糕的方法。