在java中复制InputStream的最佳方法是什么?

时间:2010-12-24 11:34:15

标签: java copy inputstream

  

可能重复:
  How to make a deep copy of an InputStream in Java ?

我有一个InputStream对象,我想复制它。这样做的最佳方式是什么?

数据不是来自文件,而是作为从网页发送的http表单的有效负载,我使用的是Apache Commons FileUpload lib,我的代码给了我InputStream,如下所示:... < / p>

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的副本/副本的最佳方法是什么?

2 个答案:

答案 0 :(得分:5)

如果您希望能够再次阅读该流,我认为您最好的选择是将InputStream包裹在BufferedInputStream中,然后使用BufferedInputStream {{1} }和mark()方法。您拥有的reset()可能不会直接支持它们,因为据我所知,它会从网络上接收数据。

答案 1 :(得分:1)

“复制”输入流的最佳方法是使用commons-io。由于您正在使用commons fileupload alread,因此额外的依赖性不会受到影响:

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

但请注意,您无法真正“复制”流。你只能“消费”它(如果你愿意,可以将内容存储在内存中)