Binary 避免文件流

Binary 避免文件流,binary,java-io,jackrabbit,jcr,Binary,Java Io,Jackrabbit,Jcr,在我的jackrabbit数据存储中,存储了大量二进制文件。 我可以浏览数据存储文件系统并毫无问题地打开这些文件 现在,如何在应用程序中使用这些文件?我当然可以用这个 类型为jcr.binary的getStream()方法,但我会将已经存在的文件的所有内容流式传输到一个新的临时文件中,对吗?因为我的二进制文件非常大,所以我不希望这样。我正在寻找一种获取二进制文件的完整文件系统路径的方法。方法 属性的getpath()只返回存储库中的路径,并且只返回映射的节点名,而不是真正存储在文件系统中的节点名

在我的jackrabbit数据存储中,存储了大量二进制文件。 我可以浏览数据存储文件系统并毫无问题地打开这些文件

现在,如何在应用程序中使用这些文件?我当然可以用这个 类型为jcr.binary的getStream()方法,但我会将已经存在的文件的所有内容流式传输到一个新的临时文件中,对吗?因为我的二进制文件非常大,所以我不希望这样。我正在寻找一种获取二进制文件的完整文件系统路径的方法。方法 属性的getpath()只返回存储库中的路径,并且只返回映射的节点名,而不是真正存储在文件系统中的节点名。通常,我必须将二进制对象解析为Java.IO.File对象,并且我希望避免流

编辑:通过反射,我看到二进制文件的类是
类org.apache.jackrabbit.core.value.BLOBInDataStore我想我必须以某种方式从那里访问文件值

我说反射可能有帮助是对的。下面是我的代码,它返回存储在jackrabbit数据存储中的二进制文件的物理文件路径:

public String getPhysicalBinaryPath(Binary b){
    try {
        Field idField=b.getClass().getDeclaredField("identifier");
        idField.setAccessible(true);
        String identifier = (String)idField.get(b).toString();
        Field storeField=b.getClass().getDeclaredField("store");
        storeField.setAccessible(true);
        Object store = storeField.get(b);
        Field pathField = store.getClass().getDeclaredField("path");
        pathField.setAccessible(true);
        String dataStorePath = (String)pathField.get(store);

        String binaryPath = identifier.substring(0,2)+File.separator+
                            identifier.substring(2,4)+File.separator+
                            identifier.substring(4,6)+File.separator+
                            identifier;

        return dataStorePath+File.separator+binaryPath;

    } catch (IllegalArgumentException ex) {
        Logger.getLogger(Repoutput.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        Logger.getLogger(Repoutput.class.getName()).log(Level.SEVERE, null, ex);
    } catch (NoSuchFieldException ex) {
        Logger.getLogger(Repoutput.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SecurityException ex) {
        Logger.getLogger(Repoutput.class.getName()).log(Level.SEVERE, null, ex);
    }

        return "";


}
编辑:这是官方的方法(你必须使用jackrabbit api)


是什么让你认为
getStream()
会创建临时文件?不是getStream()本身,而是要使用它,我必须将每个字节读入内存,你想如何处理那些不涉及将它们读入内存的blob?我想获得绝对文件路径(不仅仅是在数据存储中)并将其作为参数传递给外部程序。有没有一种方法(可能是通过反射)可以从现有的文件流获取此路径?因为filestream必须在某个地方获取从何处传输字节的信息……您可能不想使用JCR API将文件传递到外部系统—WebDAV装载(Jackrabbit自带)或HTTP可能更简单。例如,如果您通过WebDAV装载JCR存储库,您将看到文件的路径与JCR树中的路径相同。
Binary b = session.getValueFactory().createBinary(in);
Value value = session.getValueFactory().createValue(b);
  if (value instanceof JackrabbitValue) {
   JackrabbitValue jv = (JackrabbitValue) value;
   String id = jv.getContentIdentity();
  }