在 Java 中释放流

2022-09-04 08:40:02

在 C# 中,我几乎总是在处理流对象时使用该模式。例如:using

using (Stream stream = new MemoryStream())
{
    // do stuff
}

通过使用该块,我们确保在代码 bock 执行后立即在流上调用 dispose。using

我知道Java没有与关键字等效的关键字,但我的问题是,在Java中使用像a这样的对象时,我们是否需要进行任何内务处理以确保它被释放?我正在查看代码示例,我注意到它们不执行任何操作。usingFileOutputStream

我只是想知道Java在处理处理流方面的最佳实践是什么,或者它是否足够好,可以让垃圾回收器来处理它。


答案 1

通常,您必须执行以下操作:

InputStream stream = null;
try {
   // IO stuff - create the stream and manipulate it
} catch (IOException ex){
  // handle exception
} finally {
  try {
     stream.close();
  } catch (IOException ex){}
}

但是apache commons-io提供了放在子句中的内容,以使其不那么丑陋。我认为Java 7中会有一些改进。IOUtils.closeQuietly(stream);finally

更新:Jon Skeet做了一个非常有用的评论,即在类本身中很少可能发生异常的实际处理(除非它只是记录它,但实际上并没有处理它)。因此,您最好声明您的方法引发该异常,或者将其包装在自定义异常中(简单的原子操作除外)。


答案 2

你想要的功能确实是在Java 7中引入的,名称为“try-with-resources statement”(也称为自动资源管理(ARM))。代码如下:

try (InputStream in = new FileInputStream("foo.txt")) {
    ...
}  // This finally calls in.close()

推荐