Уважаемые, есть вопрос по io-стримам.
Программка качает из БД и отдаёт клиенту через web. (картинки лежат в БД, это данность)
По слоям:
- repository сходил в БД, получил blob и вяскую метадату, сформировал класс с результатом, записав в него inputStream от блоба:
new Content(resultSet.getBlob("data").getBinaryStream(), resultSet.getString("filename"))
- передал Content в service
- передал Content в controller, controller пишет inputStream из Content в response.getOutputStream():
IOUtils.copy(content.getInputStream(), response.getOutputStream());
.
Всё работает, все довольны.
Добавляю в service штуку для ресайза картинок на лету. Штука на вход хочет InputStream, откуда читать, и OutputStream, куда писать - и вот тут я не понимаю, как мне снова сформировать ответ в виде класса Content, т.к. outputStream'а на этом уровне нет.
Почитал про пайпы - как будто то, что нужно.
Но вот такой код просто зависает.
class Service {
Content getContent(id, size) {
Content content = repository.getContent(id);
PipedOutputStream out = new PipedOutputStream();
PipedInputStream in = new PipedInputStream(out);
((Runnable) () -> {
resize(content.getInputStream(), out, size);
}).run();
content.setInputStream(in);
return content;
}
Грузить полный файл в память неок.