如何在Java中最好地复制InputStream?

7
我有一个InputStream对象,我想复制它。最好的方法是什么?
这些数据不是来自文件,而是作为从网页发送的http表单的有效负载,我正在使用Apache Commons FileUpload库,给我InputStream的代码如下:...
InputStream imageStream = null;

boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        List items = new ArrayList();

        items = upload.parseRequest(request);
        Iterator iter = items.iterator();
        while (iter.hasNext()) {
            FileItem item = (FileItem) iter.next();
            if (item.isFormField()) { // this is subject Id
                if (item.getFieldName().equals("subId")) {
                    subId = Integer.parseInt(item.getString());
                    System.out.println("SubId: " + subId);
                }
            } else {
                imageStream = item.getInputStream();

            }
        }

什么是获取imageStream副本/复制的最佳方法?

1
什么是重复副本?如果您需要,可以多次读取输入流。 - Vincent Mimoun-Prat
@MarvinLabs - 抱歉,我想“duplicate copy”是一个重复的说法。 - Ankur
2个回答

5
如果你想要再次读取流,我认为最好的选择是将InputStream包装在一个BufferedInputStream中,然后使用BufferedInputStreammark()reset()方法。你现有的InputStream可能不会直接支持它们,因为据我所了解,它从网络接收数据。

1

复制输入流的最佳方法是使用commons-io。由于您已经在使用commons fileupload,因此该附加依赖项不会有任何影响:

http://commons.apache.org/io/

需要注意的是,你不能真正地“复制”一个流。你只能“消费”它(然后如果需要,将内容存储在内存中)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接