我是否需要同时调用.dispose()(javax.jcr.Binary)和.close()(java.io.InputStream)?

我是否需要同时调用.dispose()(javax.jcr.Binary)和.close()(java.io.InputStream)?,java,aem,sling,Java,Aem,Sling,我是否需要单独定义二进制对象,以便调用.dispose;在其上,请参见方法一,或者在自动关闭InputStream时,将自动处理该问题请参见方法二 对于如何测试Method2中的匿名二进制资源是否被正确处理,我真的很困惑,这就是为什么我会首先问这个问题。除非从文档中获取流的类认为关闭流就足够了,然后,您需要确保在try-to-get-try-with-resources中列出其他可关闭的资源,以便为您关闭它们 你说过二进制文件不能实现自动关闭。恼人的。:-你可以定义一个包装器,因为我认为这不是你

我是否需要单独定义二进制对象,以便调用.dispose;在其上,请参见方法一,或者在自动关闭InputStream时,将自动处理该问题请参见方法二


对于如何测试Method2中的匿名二进制资源是否被正确处理,我真的很困惑,这就是为什么我会首先问这个问题。

除非从文档中获取流的类认为关闭流就足够了,然后,您需要确保在try-to-get-try-with-resources中列出其他可关闭的资源,以便为您关闭它们

你说过二进制文件不能实现自动关闭。恼人的。:-你可以定义一个包装器,因为我认为这不是你需要处理的唯一地方,大致如下:

public class ACBinaryWrapper implements AutoCloseable {
    private Binary binary;

    public ACBinaryWrapper(Binary binary) {
        this.binary = binary;
    }

    public Binary getBinary() {
        return this.binary;
    }

    public void close() { 
        if (this.binary != null) {
            Binary b = this.binary;
            this.binary = null;
            b.dispose();
        }
    }
}
然后:

注意二进制文件是如何与is分开列出的


IOException处理程序中的LOG语句以及类似的语句似乎假设可能发生的唯一I/O错误是在关闭流时。一般来说,从流中读取数据也会导致I/O错误。

非常感谢您对IOException处理的澄清和快速回答!Binary不扩展Closeable或AutoCloseable,因此在try with resources声明中声明它不一定能处理对.dispose的调用;不过,对吧?@gdubz:对不起,我错了,我以为它是自动关闭的。等一下……没关系。阅读类中的注释,听起来好像我负责调用InputStream上的.close和二进制对象本身上的.dispose。我只是不清楚从链式初始化中调用.getStream的含义,我想可能会留下一个匿名二进制对象?或者甚至不知道如何测试/调试它。@gdubz:如果你负责调用dispose,那么是的,你不能从链式初始化中获取流。我已经更新了上面的答案。你的包装解决方案非常优雅。我试试看。非常感谢你在这方面的帮助!
public class ACBinaryWrapper implements AutoCloseable {
    private Binary binary;

    public ACBinaryWrapper(Binary binary) {
        this.binary = binary;
    }

    public Binary getBinary() {
        return this.binary;
    }

    public void close() { 
        if (this.binary != null) {
            Binary b = this.binary;
            this.binary = null;
            b.dispose();
        }
    }
}
private void yourMethod(Resource resource) {
    try (
        ACBinaryWrapper acbinary = new ACBinaryWrapper(
            resource.getValueMap().get("jcr:data", Binary.class)
        );
        InputStream is = acbinary.getBinary().getStream();
    ) {
        // ...do something with the InputStream...
    } catch (IOException e) {
        // ...appropriate handling...
    } catch (RepositoryException e) {
        // ...appropriate handling...
    }
}