Я пытаюсь хранить двоичные данные в 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
.
- Есть ли другой способ, который я упустил из виду в JCR API, где я мог бы создать
OutputStream
непосредственно на узле nt: file, какFileOutputStream
? - Если нет, есть ли простой способ преобразовать
OutpuStream
вInputStream
?
Я знаю, что другой способ доступен в Apache Commons IOUtils.copy()
. Я видел несколько примеров на SO, где они просто использовали ByteArrayOutputStream.toByteArray()
для создания InputStream
. Но поскольку данные могут стать довольно большими, это не лучшее решение. Кроме того, я попробовал, и почему-то поток был неполным, поэтому кажется, что есть ограничение буфера. Следующий подход был с конвейерными потоками, но у меня есть другие проблемы, для которых я открыл другой вопрос: Использование нескольких кавычек приводит к сбою PipedOutputStream / OutputStreamWriter
РЕДАКТИРОВАТЬ: удален пример кода PipedStream, поскольку я опубликовал проблему с ним в другом вопросе. Итак, я все еще ищу простой способ создать файл nt:, в котором вход не является InputStream
.