关闭它们后将流引用设置为null是一个好习惯吗?这会以任何方式释放资源吗?
例:
BufferedReader input= new BufferedReader(new FileReader("myfile.txt"));
// code
input.close();
input = null;
// possible more code
Run Code Online (Sandbox Code Playgroud)
不,这是不好的做法.IMO,您甚至应该考虑制作变量final.
资源处理应以标准acquire(); try { use(); } finally { release(); }方式处理.在这种情况下:
final Reader rawIn = new FileReader("myfile.txt"); // Character encoding??
try {
BufferedReader in = new BufferedReader(rawIn);
// code
} finally {
rawIn.close();
}
Run Code Online (Sandbox Code Playgroud)
实际上,此代码会选择默认设置的任何字符编码.我建议明确使用特定的硬编码字符集或来自Above的Parameterise.
final InputStream rawIn = new FileInputStream("myfile.txt");
try {
BufferedReader in = new BufferedReader(
new InputStreamReader(rawIn, "UTF-8")
);
// code
} finally {
rawIn.close();
}
Run Code Online (Sandbox Code Playgroud)
您不应该在try块之外(以及在资源分配之前)创建包装器流/读取器,因为它们可能会抛出.同样,他们的关闭可能会抛出(这实际上是一个BufferedOutputStream可以抛出的错误flush).某些输入流可能有其他资源,因此您需要两个try { ... finally { x.close(); }s.
对于输出,您通常应该flush在正常的事件过程中.但一般不要在特殊情况下.确实close通常会做一个flush,所以你不应该在特殊情况下关闭它们.如果装饰者既有flush资源又有资源,那么你将不得不咧嘴一笑.
在很少见的情况下,归零是一个好主意.例如,如果变量是对大对象的唯一引用,并且您要创建要分配给它的新大对象,则最好清除引用以在分配新对象之前回收旧对象.
不需要.仅仅input.close()是不够的.记住,在一个finally街区内做这件事总是明智的.在调用之前close()更好地做这样的空检查
finally{
if(input!=null){
input.close();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3446 次 |
| 最近记录: |