Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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 我应该使用方法close还是close安静地关闭输出流?_Java_Outputstream - Fatal编程技术网

Java 我应该使用方法close还是close安静地关闭输出流?

Java 我应该使用方法close还是close安静地关闭输出流?,java,outputstream,Java,Outputstream,当我们需要关闭输出流时,我们有两种选择 “关闭”是指关闭一条小溪,无一例外地呕吐 try { close(out) } catch(IOException e) { } 接近 try { close(out) } catch(IOException e) { throw anException; } 众所周知,关闭时,输出流会在文件末尾写入一个/多个字符,如果这些写入错误,文件也无法正确打开,例如ZipoutStream 如果我使用第一个,我将有失败关闭的风险。

当我们需要关闭输出流时,我们有两种选择

  • “关闭”是指关闭一条小溪,无一例外地呕吐

    try {
        close(out)
    } catch(IOException e) {
    }
    
  • 接近

    try {
        close(out)
    } catch(IOException e) {
        throw anException;
    }
    
  • 众所周知,关闭时,输出流会在文件末尾写入一个/多个字符,如果这些写入错误,文件也无法正确打开,例如ZipoutStream

    如果我使用第一个,我将有失败关闭的风险。 如果我使用第二个,它会让我的代码变得不友好

    有人能给我一些建议吗

    很抱歉对这个问题描述得不清楚

    我的意思是如何安全地进行IO操作。如果资源的释放失败,它会让调用者知道


    谢谢你的回答。特别感谢@Don Roby为我提供了一个链接,其中包含了@Fabian Barney回答的最佳答案,因为Java 7
    IOUtils.Closequity
    已经过时,唯一合理的解决方案是
    尝试使用资源
    自动关闭资源

    try (InputStream is = new FileInputStream(file)) {
        ...
    }
    
    请注意,它还解决了正确打开/关闭多个资源的问题

    try (InputStream is = new FileInputStream(infile); OutputStream out = new FileOutputStream(outfile)) {
       ...          
    }
    

    而且它也不会抑制
    close()
    可能抛出的IOException,这正是
    closequilly
    所做的。

    一些
    close()
    的实现可能包括其他逻辑,如写入最终字节或
    flush()
    。示例是
    FilterOutputStream

    现在想象一个基于网络通道或外部USB驱动器的流的情况。两者随时都可能消失。执行close()时可能会发生这种情况

    所以我的观点是:捕获IOException并抛出特定于应用程序的异常,包括原因异常,如:

    } catch (IOException e)
    {
        throw new IOManagementException(e);
    }
    
    若您坚持不抛出异常,那个么至少用错误状态记录If


    如果不这样做,可能会导致很难分析错误报告或奇怪的行为。

    根据经验,我从不接受异常,因此根据我编写的代码所需的逻辑,我可能会

  • 记录异常:

    try {
      close(out);
    } catch(IOException e) {
      // log the exception
      log.info("An error has occurred during stream closing: {}", e);
    }
    
  • 把它包起来再扔远一点

    try {
       close(out);
    } catch(IOException e) {
       throw new MyException(e);
    }
    
  • 由于JDK 7已经存在,我更喜欢(正如Evgeniy所提到的)使用try with resources:

    try (OutputStream out = // create output stream) {
       // do the writing
    } // at this point the stream is closed
    

    这将以适当和安全的方式关闭您正在处理的流。

    干净的代码是一件好事,但在任何情况下破坏它都会给您带来更好的结果,如维护、调试。在这种情况下,我们应该这样做。它可以用更好的方式完成,比如自定义异常或使用上面建议的Java7功能,但根据我的经验,再写几行代码的成本是值得的。

    可能重复的
    catch(IOException e){throw anException;}
    是毫无意义的-您需要声明
    throws IOException
    ,才能做到这一点,因此,您不妨跳过try/catch这是一个很好的答案,但它会让我的代码变得不友好。我知道另一种解决方案,那就是尝试{…..out.close();}捕获(IOException e){抛出一个异常;}最后{IOUtils.CloseUnquired(out)}