在Java中部署流

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

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

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

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

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

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

 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提供了IOUtils.closeQuietly(stream);finally子句中加入它使它变得有点不那么丑陋。 我认为在Java 7中会有一些改进。

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

(遗憾的是)没有相当于Java中的using语句,虽然已经有一些关于在Java 7中包含类似内容的想法。(我认为上次我看起来他们是“out”,但我发现很难跟上Java 7中的function状态。)

实际上你需要一个try / finally块:

 InputStream stream = new FileInputStream(...); try { ... } finally { stream.close(); } 

然后是在close()失败的情况下如何处理IOException的问题,以及exception问题“覆盖”代码主体抛出的任何exception – 尽管后者是一个问题。 NET也是。

使用Closeables类, Guava使这个稍微容易一些,使用静态closecloseQuietly方法处理stream为null(在块之前声明变量但在try块中赋值的情况下)。

如果有人好奇,Java 7中的新语法可能是:

 do (BufferedInputStream bis = ...; BufferedOutputStream bos = ...) { ... // Perform action with bis and bos } 

(见Joshua Bloch的提议 )

这是Stack Overflow上的相关线程 。