将<object>传递给InputStream

时间:2017-08-31 02:12:52

标签: java stream java-stream inputstream

我如何转换类型 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的数据吸入内存吗?有没有更好的方法来实现这个目标?

2 个答案:

答案 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拉出,所以它永远不会将整个集合加载到内存中