2012-10-04 5 views
1

В моем хранилище данных jabrabbit хранятся большие двоичные файлы. Я могу просматривать файловую систему datastore и открывать эти файлы без каких-либо проблем.JCR избегает потоковой передачи файлов

Теперь, как я могу использовать эти файлы из своего приложения? Я, конечно, мог бы использовать метод get12 ( ) getStream() типа jcr.binary, но тогда я бы просто передал все содержимое уже существующего файла в новый временный файл? Поскольку мои двоичные файлы очень большие, я не хочу этого. Я ищу способ получить полный путь к файловой системе двоичного файла. Метод getpath() jcr.Property возвращает только путь в репозитории и только с именами сопоставленных узлов, а не именами узлов, которые действительно хранятся в моей файловой системе. В общем, мне приходится разбирать двоичный объект в объект Java.IO.File, и я хочу избежать потоковой передачи

Редактирование: через отражение я увидел, что класс моего двоичного кода класс org.apache.jackrabbit.core. value.BLOBInDataStore Я предполагаю, что мне нужно каким-то образом получить доступ к значению файла

+0

Что заставляет вас думать, что 'getStream()' создает временные файлы? –

+0

не getStream(), а использовать его. Я должен читать в каждом байте в памяти – nico1510

+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 ""; 


} 

Edit: Это официальный способ сделать это (вы должны использовать 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(); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^