注意:这个问题及其大多数答案都发布在Java 7发布之前.Java 7提供了自动资源管理功能,可以轻松实现这一目标.如果您使用的是Java 7或更高版本,那么您应该转到Ross Johnson的答案.
什么被认为是在Java中关闭嵌套流的最佳,最全面的方法?例如,考虑设置:
FileOutputStream fos = new FileOutputStream(...)
BufferedOS bos = new BufferedOS(fos);
ObjectOutputStream oos = new ObjectOutputStream(bos);
Run Code Online (Sandbox Code Playgroud)
我理解需要保证关闭操作(可能使用finally子句).我想知道的是,是否有必要明确确保嵌套流已关闭,或者只是确保关闭外部流(oos)?
我注意到的一件事,至少在处理这个具体的例子时,内部流似乎只是抛出FileNotFoundExceptions.这似乎意味着技术上不需要担心如果失败就关闭它们.
这是同事写的:
从技术上讲,如果实施得当,关闭最外层的流(oos)就足够了.但实施似乎有缺陷.
示例:BufferedOutputStream从FilterOutputStream继承close(),它将其定义为:
155 public void close() throws IOException {
156 try {
157 flush();
158 } catch (IOException ignored) {
159 }
160 out.close();
161 }
Run Code Online (Sandbox Code Playgroud)
但是,如果flush()由于某种原因抛出运行时异常,则永远不会调用out.close().所以看起来"最安全"(但很丑陋)主要担心关闭FOS,即保持文件打开.
什么被认为是最好的,当你绝对需要确定,关闭嵌套流的方法?
是否有任何正式的Java/Sun文档可以详细解决这个问题?
我现在和过去已经深入阅读和讨论了以下问题和文章:
我将使本文成为组织中异常处理的编码标准!非常好但没有回答我:http: //www.codeproject.com/Articles/9538/Exception-Handling-Best-Practices-in-NET
Java或C#中的异常管理的最佳实践在 这里:我不喜欢这个声明:(你不应该试图捕捉每个可能的地方的每一个例外.
我有一个问题,当我需要决定用try-catch语句包含一些代码块时,我知道应该包含代码是错误的代码,我必须检查我可以检查的内容,但是例如:我需要在一些文本文件中写一行,我应该检查文件是否存在,如果我有权写入它,我应该检查磁盘上是否有空间,或者磁盘是否可写,如果我检查了如果我在编写文件时发生了什么事情(其他一些应用程序或线程使用了空间,或者可移动驱动器已被删除?),如果我检查了这些内容并处理了IOException和SecurityException以及其他可能的异常,这是最佳实践吗? ,或者我应该只检查没有try-catch?
另一个例子:我正在使用EntityFramework来访问数据库,当访问某些内容时可能会联系数据库,我知道我应该检查连接是否关闭并尝试打开它,但是有很多很多东西可能会导致这个语句失败,数据库可能位于可移动驱动器上,此驱动器可能在读取时被删除,DBMS的服务可能因任何原因停止,不会抛出空间异常,数据库的方案可能会在我尝试执行某些代码后发生变化****原因,我如何防止我的代码失败,我可以检查我可以检查的每件事,然后继续吗?或者我应该使用try catch作为例外我可以期待,即使我已经检查了它们?
请给我你的答案参考,而不是一般的答案!
编辑
请务必阅读:http: //msdn.microsoft.com/en-us/library/seyhszts.aspx