Aem 如何以编程方式编写nt:文件

Aem 如何以编程方式编写nt:文件,aem,jcr,Aem,Jcr,我试图在JCR中存储二进制数据,JCR是动态创建的。我的问题是JCR API提供的唯一方法是通过InputStream: Session session = request.getResourceResolver().adaptTo(Session.class); ValueFactory valueFactory = session.getValueFactory(); Binary bin = valueFactory.createBinary(is); 由于CQ/Sling是RESTfu

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

Session session = request.getResourceResolver().adaptTo(Session.class);
ValueFactory valueFactory = session.getValueFactory();
Binary bin = valueFactory.createBinary(is);
由于CQ/Sling是RESTful的,我可以理解为什么会出现这种情况,因为您通常会得到一个表单post或一个到另一个源的httprequest,其中您总是有一个
InputStream
可供使用。但在我的例子中,我正在动态创建二进制文件,它通常表示为
输出流

  • 在JCR API中,有没有其他我忽略的方法可以直接在nt:file节点上创建一个
    OutputStream
    ,就像
    FileOutputStream
  • 如果没有,是否有一种简单的方法将
    输出流
    转换为
    输入流
  • 我知道另一种方法可以从Apache Commons
    IOUtils.copy()
    获得。我在SO上看到了一些示例,其中他们只使用
    ByteArrayOutputStream.toByteArray()
    创建
    输入流。但由于数据可能变得相当大,这不是一个好的解决方案。此外,我尝试了它,不知何故流是不完整的,所以它似乎有一个缓冲限制。下一种方法是使用管道流,但我还有其他问题,我提出了另一个问题:

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

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

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

      ByteArrayOutputStream out = new ByteArrayOutputStream(); 
      //alternatively, get the outputstream of your binary file generator
      (...) //put data into out
      InputStream is = new ByteArrayInputStream(out.toByteArray())
    

    管道是很好的解决方案。但是,为了正确地实现它们,您必须使用两个线程:第一个线程应该将数据写入
    PipedOutputStream
    ,第二个线程应该从
    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)也很好。

    我一开始尝试过,但对于代码示例,结果是JCR库中的二进制文件不完整。我使用IOUtils.toString()在单元测试中进行了尝试,结果成功了。现在我需要在CQ试一试。