我如何寻找(更改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
,FileChannel
+ ByteBuffer
,甚至更多)。
答案 0 :(得分:10)
您使用reset()
/ skip()
。我不能说这是世界上最好的API,但它应该有效:
public void seek(ByteArrayInputStream input, int position)
throws IOException
{
input.reset();
input.skip(position);
}
当然,这假设没有人打电话给mark()
。
答案 1 :(得分:4)
如果您要创建要传递到其他地方的ByteArrayInputStream
,请按照您的意愿扩展该类并操纵pos
(protected
成员ByteArrayInputStream
)。
答案 2 :(得分:1)
有一个ByteArrayInputStream(byte(), int, int)
构造函数,它将为您提供一个输入流,该输入流将从给定的偏移量开始读取给定的字节数。您可以使用它来模拟在流中寻找任意偏移量。
你必须处理“寻找”给你一个新的流对象这一事实,这可能很尴尬。但是,这种方法不涉及复制任何字节或将它们保存到文件中,并且不用担心关闭ByteArrayInputStream
对象应该是安全的。