Ste*_*eve 14 file-io file jackrabbit jcr jsr170
我有以下代码将"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);
Run Code Online (Sandbox Code Playgroud)
Ran*_*uch 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();
Run Code Online (Sandbox Code Playgroud)
如果您正在使用JCR 2.0,则最后一行有点不同,因为您首先必须从属性值获取Binary对象:
InputStream content = jcrContent.getProperty("jcr:data").getBinary().getStream();
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用标准Java流实用程序将"内容"流中的字节写入文件.
当你完成Binary对象时,一定要调用Binary的dispose()方法来告诉你已完成二进制文件,并且实现可以释放Binary对象获取的所有资源.你应该总是这样做,即使一些JCR实现试图通过返回一个流来捕获编程错误,当关闭时,它会自动dispose()为你调用.
| 归档时间: |
|
| 查看次数: |
14521 次 |
| 最近记录: |