如何以编程方式编写 nt:file

问题描述 投票:0回答:2

我正在尝试将二进制数据存储在 JCR 中,这是动态创建的。我的问题是 JCR API 提供的唯一方法是通过

InputStream
:

Session session = request.getResourceResolver().adaptTo(Session.class);
ValueFactory valueFactory = session.getValueFactory();
Binary bin = valueFactory.createBinary(is);

由于 CQ/Sling 是 RESTful,我可以理解为什么会出现这种情况,因为您通常会收到一个表单帖子或一个到另一个源的 httprequest,您总是有一个

InputStream
可以使用。但就我而言,我正在动态创建二进制文件,通常表示为
OutputStream

  1. 我在 JCR API 中是否忽略了任何其他方法,可以直接在 nt:file 节点上创建
    OutputStream
    ,就像
    FileOutputStream
    一样?
  2. 如果没有,有没有一种简单的方法可以将
    OutpuStream
    转换为
    InputStream

我知道 Apache Commons 提供了另一种方式

IOUtils.copy()
。我见过一些例子,他们只是使用
ByteArrayOutputStream.toByteArray()
创建
InputStream
。但由于数据可能变得相当大,这不是一个好的解决方案。此外,我尝试了它,但不知何故,流不完整,所以似乎存在缓冲区限制。下一个方法是使用管道流,但是我还有其他问题,我提出了另一个问题:多个引号导致 PipedOutputStream/OutputStreamWriter 失败

编辑: 删除了 PipedStream 代码示例,因为我在另一个问题中发布了该问题。所以在这里我仍然只是在寻找一种简单的方法来创建一个 nt:file 其中输入不是

InputStream
.

java aem jcr
2个回答
5
投票

管道是很好的解决方案。但是,为了正确实现它们,您必须使用两个线程:第一个应该将数据写入

PipedOutputStream
,第二个应该从
Binary
创建一个
PipedInputStream
并将其保存到JCR中:

final PipedInputStream pis = new PipedInputStream();
final PipedOutputStream pos = new PipedOutputStream(pis);
Executors.newSingleThreadExecutor().submit(new Runnable() {         
    @Override
    public void run() {
        try {
            OutputStreamWriter writer = new OutputStreamWriter(pos);
            writer.append("append here some data");
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
});
Binary binary = session.getValueFactory().createBinary(pis);
session.getNode("/content/myNode").setProperty("xyz", binary);
session.save();

在新线程中处理 JCR 的对称解决方案也不错。


0
投票

您尝试过这里描述的方法吗?

http://ostermiller.org/convert_java_outputstream_inputstream.html

我认为最简单的方法是使用数组:

  ByteArrayOutputStream out = new ByteArrayOutputStream(); 
  //alternatively, get the outputstream of your binary file generator
  (...) //put data into out
  InputStream is = new ByteArrayInputStream(out.toByteArray())
© www.soinside.com 2019 - 2024. All rights reserved.