Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关闭流/套接字并最终尝试捕获_Java_Sockets_Character Encoding_Io_Try Catch - Fatal编程技术网

Java 关闭流/套接字并最终尝试捕获

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

下面是一个我有疑问的例子(来自另一个SO问题):

现在,我认为这段代码运行良好,并在应该的地方发布了所有资源。我的问题是:

  • 为什么要关闭
    try catch finally
    finally
    部分中的
    FileOutputStream
    ?当然我可以把代码按顺序放在
    try catch
    之后吗

  • 为什么我必须单独关闭
    FileOutputStream
    ,而不是简单地用
    new OutputStreamWriter(新文件名)替换
    new OutputStreamWriter(fos,…
    ,…
    ?如果我先关闭FileOutputStream,是否会自动关闭其余部分并释放资源?同样的问题适用于套接字,如果我关闭套接字连接,是否会自动关闭流读写器并释放资源

  • 由于不同的系统具有不同的字符集(或类似的字符集),我反复被告知要确保读写流使用“UTF-8”。在读写原始字节数据(比如从非文本文件或加密结果)时,这是否仍然适用正如我所想,字符集只处理文本字符在哪里


  • 第一点——如果您的代码抛出错误,而不是异常,那么如果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

  • 通常,在catch块中,有人会抛出RuntimeException,这将导致此方法返回。如果您不在finally中清理资源,它们将不会被清理。在您的示例中,您应该在finally块之后关闭,因为您没有强制退出
  • 对包装器流调用close()应该关闭子流。如果您编写自己的包装器流,则其close方法应该将close()委托给其子流。这就是为什么我说应该这样做的原因,应该由实现者对其子流调用close()
  • 如果您正在写入原始字节数据,则不需要指定utf-8。它是一种字符编码,有助于以各种语言显示字符
  • 因为如果代码抛出未处理的异常,try-catch bloc之后的代码段将永远不会执行。例如,
    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();