14

「rose.gif」を roseNode に挿入する次のコードがあります。しかし、リポジトリからファイルを取得するにはどうすればよいですか?

    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);
4

1 に答える 1

18

実際に行う必要があるのは、「nt:file」ノードの名前からファイルの名前を取得し、「jcr:content」子ノードの「jcr:data」プロパティからファイルのコンテンツを取得することだけです。 。

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を使用している場合、最初にプロパティ値からBinaryオブジェクトを取得する必要があるため、最後の行は少し異なります。

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

次に、標準のJavaストリームユーティリティを使用して、「content」ストリームからファイルにバイトを書き込むことができます。

Binaryオブジェクトの使用が終了したら、必ずBinaryのメソッドを呼び出して、Binaryのdispose()使用が終了し、実装がBinaryオブジェクトによって取得されたすべてのリソースを解放できることを通知します。一部のJCR実装は、閉じられると自動的に呼び出されるストリームを返すことでプログラミングエラーをキャッチしようとしますが、常にこれを行う必要がありdispose()ます。

于 2011-01-14T03:22:28.577 に答える