使用java.io查找ByteArrayInputStream

使用java.io查找ByteArrayInputStream,java,io,stream,nio,Java,Io,Stream,Nio,如何通过tearrayinputstream(java.io)查找(更改位置)?这很明显,但我似乎在任何地方都找不到这样的方法(标记/重置是不够的,我需要将位置设置为输入流上的任何位置) 如果不能使用java.io完成,我必须切换到java.nio并使用ByteBuffer,我如何获得类似于DataOutputStream的东西,用java.nio包装ByteArrayOutputStream?我没有找到任何自动调整大小的缓冲区 编辑:我找到了一种方法来实现我想做的事情,但它有点混乱ImageI

如何通过tearrayinputstream(
java.io
)查找(更改位置)?这很明显,但我似乎在任何地方都找不到这样的方法(
标记
/
重置
是不够的,我需要将位置设置为
输入流
上的任何位置)

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

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

这是我第一次尝试使用JavaIO类,结果完全是负面的。它缺少一些基本(IMO)功能,并且有很多方法可以做同样的事情(例如,要从文件中读取原语,您可以使用
随机访问文件
数据输入流
+
文件输入流
文件图像输入流
文件通道
+
ByteBuffer
,甚至更多).

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

public void seek(ByteArrayInputStream input, int position)
    throws IOException
{
    input.reset();
    input.skip(position);
}
当然,这假设没有人调用
mark()

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


您必须处理这样一个事实,即“查找”给您提供了一个新的流对象,这可能会很尴尬。但是,这种方法不需要复制任何字节或将它们保存到文件中,而且不必麻烦关闭
ByteArrayInputStream
对象应该是安全的。

(受
保护的
成员,属于
ByteArrayInputStream
)如您所愿。

您认为使用
seek
有什么问题吗?@Vilay Mathew:What
seek
方法?我在ByteArrayInputStream上看不到任何问题。java中的文件I/o非常混乱。我把它教给一年级学生,并试图让它变得简单,但这总是一个混乱点。如果不调用mark,则标记位置的默认值为Is 0因此调用reset将指针移动到0,然后skip函数将指针移动到给定的值position@SumitKumarSaha:是的……我不确定你评论的要点。我只是把你的答案加起来