Java 关闭流/套接字并最终尝试捕获
下面是一个我有疑问的例子(来自另一个SO问题): 现在,我认为这段代码运行良好,并在应该的地方发布了所有资源。我的问题是:Java 关闭流/套接字并最终尝试捕获,java,sockets,character-encoding,io,try-catch,Java,Sockets,Character Encoding,Io,Try Catch,下面是一个我有疑问的例子(来自另一个SO问题): 现在,我认为这段代码运行良好,并在应该的地方发布了所有资源。我的问题是: 为什么要关闭try catch finally的finally部分中的FileOutputStream?当然我可以把代码按顺序放在try catch之后吗 为什么我必须单独关闭FileOutputStream,而不是简单地用new OutputStreamWriter(新文件名)替换new OutputStreamWriter(fos,…,…?如果我先关闭FileOutpu
try catch finally
的finally
部分中的FileOutputStream
?当然我可以把代码按顺序放在try catch
之后吗FileOutputStream
,而不是简单地用new OutputStreamWriter(新文件名)替换new OutputStreamWriter(fos,…
,…
?如果我先关闭FileOutputStream,是否会自动关闭其余部分并释放资源?同样的问题适用于套接字,如果我关闭套接字连接,是否会自动关闭流读写器并释放资源第一点——如果您的代码抛出错误,而不是异常,那么如果close语句不在finally中,FileOutputStream将不会关闭。在您捕获异常的情况下,这有点人为,但在更典型的情况下,会捕获更具体的异常,除非您整理资源在finally块中,方法的执行可能在到达将关闭资源的代码之前终止。为什么要在try-catch-finally的finally部分关闭FileOutputStream 您可以将
close()
放在所有写入/读取操作块的末尾,但如果在其中(读取/写入)出现错误,您将到达异常处理块,并且不会关闭任何流。如果您选择将close()放在
在异常处理块中,一切正常,猜怎么着?…没有流将被关闭。因此,您可以在两个代码块中都执行此操作,但这样代码的可读性就会降低。因此,将其放在finally块上可以确保无论哪种方式它都将被关闭
第二,你应该只关闭最后一个被链接的流
fos = new FileOutputStream(filename);
out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(fos, "UTF-8")));
你只需要
out.close();
这将关闭与输出流关联的其他流
UTF-8部分取决于您试图读取的数据编码类型,如果您编码UTF-8,请解码UTF-8
NullPointerException
就是这种情况OutputStreamWriter
将代码'out.close();'for out=new PrintWriter(…)移动到最终阻止,与'fos=new FileOutputStream(filename)'定义的代码相同;'您写入:“我现在找不到线程”。也许你是指22answers.com上的线程。@mKorbel-谢谢。@Marnix Klooster-是的,这实际上是SO上的一篇文章的副本。@Jonathon-谢谢编辑。你确定“这将关闭与输出流相关的其他流”吗部分?这在PrintWriter类中的javadoc for close中没有记录。如果在构造装饰器时发生异常,则[仅]关闭最后一个流将导致泄漏。
out.close();