当前位置: 首页 > 面试题库 >

如何在Java中制作InputStream的深层副本

佟英武
2023-03-14
问题内容

我想知道如何制作一个深复制InputStream

我知道可以使用IOUtils软件包来完成,但是如果可能的话,我想避免使用它们。有谁知道替代方法?


问题答案:

InputStream是抽象的,不会公开(也不公开其子级)内部数据对象。因此,“深度复制”
InputStream的唯一方法是创建ByteArrayOutputStream,然后在InputStream上执行read()之后,将此数据写入()到ByteArrayOutputStream。然后做:

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

如果您mark()在InputStream 上使用,则实际上您无法撤消此操作。这使您的流“已消耗”。

要“重用”您的InputStream,请避免使用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



 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : 9年前关闭。 可能重复: 如何克隆ArrayList并克隆其内容? 试图复制一个ArrayList。基础对象很简单,包含Strings,ints,BigDecimals,Dates和DateTime对象。如何确保对新ArrayList所做的修改不会反映在旧ArrayList中? 干杯,P 问题答案: 在添加对象之前先对其进行克隆。例如,代替 假设已正确覆

  • 问题内容: 实现深层对象复制功能有点困难。您采取什么步骤来确保原始对象和克隆对象没有引用? 问题答案: 一种安全的方法是序列化对象,然后反序列化。这样可以确保所有内容都是全新的参考。 这是有关如何有效执行此操作的文章。 注意事项:类可能会覆盖序列化,这样就不会创建新实例,例如单例。如果您的课程不是可序列化的,那么这当然也行不通。

  • 问题内容: 我想对Python中的函数进行深拷贝。该 副本 模块是没有帮助的,根据文件,其中说: 该模块不复制诸如模块,方法,堆栈跟踪,堆栈框架,文件,套接字,窗口,数组或任何类似类型的类型。它通过不变地返回原始对象来“复制”函数和类(浅层和深层)。这与泡菜模块处理这些食物的方式兼容。 我的目标是使两个函数具有相同的实现,但具有不同的文档字符串。 那怎么办呢? 问题答案: FunctionType

  • 问题内容: 是否可以在不使用序列化的情况下对Java对象进行深层复制/克隆?如果是这样,那又如何? 问题答案: 您可以使用制作对象的深层副本。当您无法(或不想)使您的类可序列化时,这真的很有用。用法很简单:

  • 问题内容: 我们有一个元素列表,并且有一个非常简单的碰撞检测,可以将每个对象与其他每个对象进行检查。 该检查是可交换的,因此为了避免重复两次,我们将在C ++中执行此操作: 这里的关键是副本 您将如何用Java编写此代码? 问题答案: 您不能复制Java迭代器,因此没有它们就必须这样做:

  • 问题内容: 在Objective-C中,可以通过以下方式进行深度复制: 如何在Swift中进行深度复制? 问题答案: 深拷贝 您的示例不是在StackOverflow上讨论的深层副本。获得对象的真实深层副本通常需要 迅速复制 该协议是提供对象副本的Objective- C方法,因为一切都是指针,并且您需要一种管理任意对象副本生成的方法。对于Swift中的任意对象副本,您可以提供一个便利的初始化程序