Java:关闭流后使引用为null

Hei*_*Hei 6 java

关闭它们后将流引用设置为null是一个好习惯吗?这会以任何方式释放资源吗?

例:

BufferedReader input= new BufferedReader(new FileReader("myfile.txt"));

// code

input.close();
input = null;

// possible more code
Run Code Online (Sandbox Code Playgroud)

Tom*_*ine 7

不,这是不好的做法.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资源又有资源,那么你将不得不咧嘴一笑.

在很少见的情况下,归零是一个好主意.例如,如果变量是对大对象的唯一引用,并且您要创建要分配给它的新大对象,则最好清除引用以在分配新对象之前回收旧对象.

  • 在流声明中使用`final`的+1.-1用于关闭内部(`rawIn`)流.您应该始终关闭最派生的流.例如,在你的情况下,`BufferedReader`可能在其内部缓冲区中有一些数据.在`in`上调用close将正确刷新这些数据.在`rawIn`上调用close将丢弃它. (5认同)

bra*_*boy 5

不需要.仅仅input.close()是不够的.记住,在一个finally街区内做这件事总是明智的.在调用之前close()更好地做这样的空检查

finally{
  if(input!=null){
    input.close();
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果在*try块之前执行原始赋值*,则不需要进行无效检查.如果无法打开文件,它将只会失败,在这种情况下无论如何都没有问题. (3认同)