代码之家  ›  专栏  ›  技术社区  ›  Dónal

自动关闭作为参数传递的资源

  •  6
  • Dónal  · 技术社区  · 6 年前

    如果我想自动关闭作为参数传递的资源,有没有比这更优雅的解决方案?

    void doSomething(OutputStream out) {
    
      try (OutputStream closeable = out) {
        // do something with the OutputStream
      }
    }
    

    理想情况下,我希望自动关闭此资源,而不声明另一个变量 closeable out .

    旁白

    外面的 在内部 doSomething 被认为是不好的做法

    3 回复  |  直到 6 年前
        1
  •  5
  •   Mark Rotteveel    6 年前

    使用Java9和更高版本,您可以

    void doSomething(OutputStream out) {
      try (out) {
        // do something with the OutputStream
      }
    }
    

    只有当 out Java Language Specification version 10 14.20.3. try-with-resources .

        2
  •  3
  •   Oleg Cherednik    6 年前

    我使用Java8,它不支持资源引用。创建接受 Closable

    public static <T extends Closeable> void doAndClose(T out, Consumer<T> payload) throws Exception {
        try {
            payload.accept(out);
        } finally {
            out.close();
        }
    }
    

    客户端代码可能如下所示:

    OutputStream out = null;
    
    doAndClose(out, os -> {
        // do something with the OutputStream
    });
    
    InputStream in = null;
    
    doAndClose(in, is -> {
        // do something with the InputStream
    });
    
        3
  •  -4
  •   M.F    6 年前
    void doSomething(OutputStream out) {
      try {
        // do something with the OutputStream
      }
      finally {
        org.apache.commons.io.IOUtils.closeQuietly(out);
      }
    }