[英]Seeking a ByteArrayInputStream using java.io
如何查找(更改位置) ByteArrayInputStream
( java.io
)? 这是显而易见的事情,但我似乎无法在任何地方找到这种方法( mark
/ reset
是不够的,我需要将位置设置为InputStream
上的任何位置)。
如果无法使用java.io
完成并且我必须切换到java.nio
并使用ByteBuffer
,那么如何使用java.nio
获取类似于包装ByteArrayOutputStream
的DataOutputStream
? 我没有找到任何类型的可自动调整大小的缓冲区。
编辑:我找到了一种方法来实现我正在尝试做的事情,但它有点凌乱。 ImageIO.createImageInputStream
创建一个ImageInputStream
,这正是我想要的(可以搜索和读取基元)。 但是,使用ByteArrayInputStream
返回FileCacheImageInputStream
,这基本上意味着它将字节数组复制到文件中以进行搜索。
这是我第一次尝试使用Java IO类,但它完全是否定的。 它缺少一些基本的(IMO)功能,它有很多方法可以做同样的事情(例如,从文件中读取原语,你可以使用RandomAccessFile
, DataInputStream
+ FileInputStream
, FileImageInputStream
, FileChannel
+ ByteBuffer
,甚至更多)。
你可以使用reset()
/ skip()
。 我不能说它是世界上最好的API,但它应该工作:
public void seek(ByteArrayInputStream input, int position)
throws IOException
{
input.reset();
input.skip(position);
}
当然,这假设没有人调用mark()
。
如果要创建ByteArrayInputStream
以传递到其他位置,请根据需要扩展该类并操作pos
( ByteArrayInputStream
的protected
成员)。
有一个ByteArrayInputStream(byte(), int, int)
构造函数,它将为您提供一个输入流,该输入流将从给定的偏移量开始读取给定的字节数。 您可以使用它来模拟在流中寻找任意偏移量。
你必须处理“寻找”给你一个新的流对象这一事实,这可能很尴尬。 但是,这种方法不涉及复制任何字节或将它们保存到文件中,并且不用担心关闭ByteArrayInputStream
对象应该是安全的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.