使用 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) 功能,并且它有很多方法可以做同样的事情(例如,从文件中读取原语,您可以使用 RandomAccessFile
、DataInputStream
+ FileInputStream
、FileImageInputStream
、@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
以传递到其他地方,请扩展类并根据需要操作 pos
(ByteArrayInputStream
的 protected
成员)。
【讨论】:
【参考方案3】:有一个ByteArrayInputStream(byte(), int, int)
构造函数将为您提供一个输入流,该输入流将从给定的偏移量开始读取给定的字节数。您可以使用它来模拟寻找到流中的任意偏移量。
你必须处理“寻找”给你一个新的流对象的事实,这可能很尴尬。但是,这种方法不涉及复制任何字节或将它们保存到文件中,并且不必费心关闭ByteArrayInputStream
对象应该是安全的。
【讨论】:
以上是关于使用 java.io 寻找 ByteArrayInputStream的主要内容,如果未能解决你的问题,请参考以下文章
java.io.FileNotFoundException: Could not open ServletContext resource [/db.properties]
java.io.EOFException:ZLIB输入流的意外结束 - 从HTTP读取