2011-01-13 97 views
12

我有以下代碼將「rose.gif」插入到roseNode中。但是,如何從存儲庫中檢索文件?從JCR文件節點獲取文件

Node roseNode = session.getRootNode().getNode("wiki:encyclopedia/wiki:entry[1]/"); 

    File file = new File("rose.gif"); 
    MimeTable mt = MimeTable.getDefaultTable(); 
    String mimeType = mt.getContentTypeFor(file.getName()); 
    if (mimeType == null) mimeType = "application/octet-stream"; 

    Node fileNode = roseNode.addNode(file.getName(), "nt:file"); 

    System.out.println(fileNode.getName()); 

    Node resNode = fileNode.addNode("jcr:content", "nt:resource"); 
    resNode.setProperty("jcr:mimeType", mimeType); 
    resNode.setProperty("jcr:encoding", ""); 
    resNode.setProperty("jcr:data", new FileInputStream(file)); 
    Calendar lastModified = Calendar.getInstance(); 
    lastModified.setTimeInMillis(file.lastModified()); 
    resNode.setProperty("jcr:lastModified", lastModified); 

    //retrieve file and output as rose-out.gif 
    File outputFile = new File("rose-out.gif"); 
    FileOutputStream out = new FileOutputStream(outputFile); 

回答

16

你真正需要做的唯一的事情是得到了「NT:文件」的名稱的文件的名稱節點,並從該文件的內容「JCR:數據」屬性的「jcr:content」子節點。

JCR 1.0和2.0在如何獲取二進制「jcr:data」屬性值的流方面有所不同。如果您使用JCR 1.0,那麼代碼會是這樣:

Node fileNode = // find this somehow 
Node jcrContent = fileNode.getNode("jcr:content"); 
String fileName = fileNode.getName(); 
InputStream content = jcrContent.getProperty("jcr:data").getStream(); 

如果您使用JCR 2.0,最後一行是有點不同,因爲首先必須從物業得到的二進制對象值:

InputStream content = jcrContent.getProperty("jcr:data").getBinary().getStream(); 

然後,您可以使用標準Java流實用程序將'content'流中的字節寫入文件。

當你完成二進制對象時,一定要調用二進制的dispose()方法來告訴你已經完成二進制的信號,並且實現可以釋放二進制對象獲取的所有資源。即使某些JCR實現嘗試通過返回一個流,在關閉時會自動爲您調用dispose(),您應該始終這樣做。

+0

嗨Randall,我想要的是一個OutputStream而不是輸入流。這可能嗎? – Steve 2011-01-14 16:50:31