用Java处理流

dcp*_*dcp 9 java stream

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

using (Stream stream = new MemoryStream())
{
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

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

我知道Java没有等效的using关键字,但我的问题是,当使用像FileOutputStreamJava这样的对象时,我们是否需要做任何内务管理以确保它被处理掉?我正在看这个代码示例,我注意到他们没有做任何事情.

我只是想知道Java处理流的最佳实践是什么,或者它是否足以让垃圾收集器处理它.

Boz*_*zho 9

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

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

但是apache commons-io提供IOUtils.closeQuietly(stream);了一个finally条款,使它变得有点不那么丑陋.我认为在Java 7中会有一些改进.

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


Nay*_*uki 5

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

try (InputStream in = new FileInputStream("foo.txt")) {
    ...
}  // This finally calls in.close()
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的语法,在出现错误的情况下,您可以保留代码中抛出的异常和关闭时的异常 (2认同)