JCR避免文件流

时间:2012-10-04 14:00:51

标签: binary java-io jackrabbit jcr

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

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

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

1 个答案:

答案 0 :(得分:0)

当我说反思可能有所帮助时我是对的。这是我的代码,它返回存储在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)

Binary b = session.getValueFactory().createBinary(in);
Value value = session.getValueFactory().createValue(b);
  if (value instanceof JackrabbitValue) {
   JackrabbitValue jv = (JackrabbitValue) value;
   String id = jv.getContentIdentity();
  }