代码之家  ›  专栏  ›  技术社区  ›  Spredzy

如何在Java中实现输入流的深层复制

  •  6
  • Spredzy  · 技术社区  · 15 年前

    我想知道如何制作 InputStream .

    我知道可以用ioutils包来完成,但是如果可能的话,我想避免使用它们。 有人知道另一种方法吗?

    1 回复  |  直到 10 年前
        1
  •  16
  •   Peter Knego    14 年前

    inputstream是抽象的,不公开(也不公开其子级)内部数据对象。所以“深度复制”inputstream的唯一方法是创建bytearrayOutputstream,在对inputstream执行read()之后,将()此数据写入bytearrayOutputstream。然后这样做:

    newStream = new ByteArrayInputStream(byteArrayOutputStream.toArray());
    

    如果您正在使用 mark() 在你的输入流中,你确实不能反转这个。这会使您的流“消耗”。

    要“重用”输入流,请避免使用mark(),然后在读取结束时调用reset()。然后您将从流的开始处阅读。

    编辑:

    顺便说一句,ioutils使用这个简单的代码段来复制inputstream:

    public static int copy(InputStream input, OutputStream output) throws IOException{
         byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
         int count = 0;
         int n = 0;
         while (-1 != (n = input.read(buffer))) {
             output.write(buffer, 0, n);
             count += n;
         }
         return count;
     }
    

    阅读更多: http://kickjava.com/src/org/apache/commons/io/CopyUtils.java.htm#ixzz13ymaCX9m