我如何转换类型
Stream<Object>
成InputStream
?目前,我获取迭代器并遍历所有数据,将其转换为byteArray并将其添加到inputStream:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
Iterator<MyType> myItr = MyObject.getStream().iterator();
while (myItr.hasNext()) {
oos.writeObject(myItr.next().toString()
.getBytes(StandardCharsets.UTF_8));
}
oos.flush();
oos.close();
InputStream is = new ByteArrayInputStream(bao.toByteArray());
这样做的开销是多少?如果我的流包含数TB的数据,我不会将数TB的数据吸入内存吗?有没有更好的方法来实现这个目标?
答案 0 :(得分:2)
您应该可以使用管道将OutputStream
转换为InputStream
:
PipedOutputStream pos = new PipedOutputStream();
InputStream is = new PipedInputStream(pos);
new Thread(() -> {
try (ObjectOutputStream oos = new ObjectOutputStream(pos)) {
Iterator<MyType> myItr = MyObject.getStream().iterator();
while (myItr.hasNext()) {
oos.writeObject(myItr.next().toString()
.getBytes(StandardCharsets.UTF_8));
}
} catch (IOException e) {
// handle closed pipe etc.
}
}).start();
受this answer的启发。
答案 1 :(得分:2)
这对你有用吗?
https://gist.github.com/stephenhand/292cdd8bba7a452d83c51c00d9ef113c
它是一个InputStream
实现,它以Stream<byte[]>
作为输入数据。你只需要{1}你的abitrary对象到字节数组,但你希望每个对象都表示为字节。
当.map()
被读取时,它仅在Stream
上调用终端操作,当消费者读取InputStream
的更多内容时,将对象从Stream
拉出,所以它永远不会将整个集合加载到内存中