使用 java.io 寻找 ByteArrayInputStream

Posted

技术标签:

【中文标题】使用 java.io 寻找 ByteArrayInputStream【英文标题】:Seeking a ByteArrayInputStream using java.io 【发布时间】:2011-04-17 02:30:18 【问题描述】:

如何寻找(更改位置)ByteArrayInputStream (java.io)?这是很明显的事情,但我似乎无法在任何地方找到这种方法(mark/reset 还不够,我需要将位置设置为InputStream 上的任何位置)。

如果使用java.io 无法完成,我必须切换到java.nio 并使用ByteBuffer,我怎样才能得到类似于DataOutputStream 使用ByteArrayOutputStream 包装java.nio 的东西?我没有找到任何类型的自动调整大小的缓冲区。

编辑:我找到了一种方法来实现我正在尝试做的事情,但它有点混乱。 ImageIO.createImageInputStream 创建一个 ImageInputStream,这正是我想要的(可以查找和读取原语)。但是,使用ByteArrayInputStream 会返回FileCacheImageInputStream,这基本上意味着它将字节数组复制到文件中只是为了寻找。

这是我第一次尝试使用 Java IO 类,结果完全是负面的。它缺少一些基本 (IMO) 功能,并且它有很多方法可以做同样的事情(例如,从文件中读取原语,您可以使用 RandomAccessFileDataInputStream + FileInputStreamFileImageInputStream、@987654340 @ + ByteBuffer,甚至更多)。

【问题讨论】:

你觉得使用seek有什么问题吗? @Vilay Mathew:什么seek 方法?我在 ByteArrayInputStream 上没有看到任何内容。 Java 中的文件 i/o 非常混乱。我把它教给一年级的学生,并试图让它变得简单,但这总是让人困惑。 【参考方案1】:

你会使用reset()/skip()。我不能说它是世界上最好的 API,但它应该可以工作:

public void seek(ByteArrayInputStream input, int position)
    throws IOException

    input.reset();
    input.skip(position);

当然,这是假设没有人打电话给mark()

【讨论】:

如果不调用标记,则标记位置的默认值为0,因此调用reset将指针移动到0,然后skip函数将指针移动到给定位置 @SumitKumarSaha:是的......我不确定你的评论的意义。 我只是在总结你的答案【参考方案2】:

如果您要创建 ByteArrayInputStream 以传递到其他地方,请扩展类并根据需要操作 posByteArrayInputStreamprotected 成员)。

【讨论】:

【参考方案3】:

有一个ByteArrayInputStream(byte(), int, int) 构造函数将为您提供一个输入流,该输入流将从给定的偏移量开始读取给定的字节数。您可以使用它来模拟寻找到流中的任意偏移量。

你必须处理“寻找”给你一个新的流对象的事实,这可能很尴尬。但是,这种方法不涉及复制任何字节或将它们保存到文件中,并且不必费心关闭ByteArrayInputStream 对象应该是安全的。

【讨论】:

以上是关于使用 java.io 寻找 ByteArrayInputStream的主要内容,如果未能解决你的问题,请参考以下文章

java.io.FileNotFoundException: Could not open ServletContext resource [/db.properties]

java.io.EOFException:ZLIB输入流的意外结束 - 从HTTP读取

JAXB Java 编组错误

字节数组流ByteArrayInputStream&ByteArrayOutputStream

Java:在quoted-printable中编码字符串

2.最简单java理解IO流的使用(原理)