在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使这个稍微容易一些,使用静态close
和closeQuietly
方法处理stream
为null(在块之前声明变量但在try块中赋值的情况下)。
如果有人好奇,Java 7中的新语法可能是:
do (BufferedInputStream bis = ...; BufferedOutputStream bos = ...) { ... // Perform action with bis and bos }
(见Joshua Bloch的提议 )
这是Stack Overflow上的相关线程 。