2011-01-13 4 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ストリームユーティリティを使用して、 'コンテンツ'ストリームからファイルにバイトを書き込むことができます。あなたがバイナリオブジェクトで行われている

、あなたはバイナリで行われ、実装はバイナリオブジェクトによって取得したすべてのリソースを解放できることをしているという信号を伝えるために、バイナリのdispose()メソッドを呼び出してください。 JCRの実装によっては、終了時に自動的にdispose()が呼び出されるストリームを返すことで、プログラミングエラーをキャッチしようとしていても、常にこれを行う必要があります。

+0

こんにちはRandall、私が欲しいのは、OutputStreamであり、入力ストリームではありません。これは可能ですか? – Steve

+0

私はそれを理解しました。 inputStreamをバイト単位でoutputStreamに変換するだけです。 – Steve

+0

2.0については、バイナリオブジェクト(http://www.day.com/specs/jcr/2.0/5_Reading.html)で作業したときにBinary.dispose()を呼び出さなければならないと思います。 –

関連する問題