繁体   English   中英

使用java.io寻找ByteArrayInputStream

[英]Seeking a ByteArrayInputStream using java.io

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

如果无法使用java.io完成并且我必须切换到java.nio并使用ByteBuffer ,那么如何使用java.nio获取类似于包装ByteArrayOutputStreamDataOutputStream 我没有找到任何类型的可自动调整大小的缓冲区。

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

这是我第一次尝试使用Java IO类,但它完全是否定的。 它缺少一些基本的(IMO)功能,它有很多方法可以做同样的事情(例如,从文件中读取原语,你可以使用RandomAccessFileDataInputStream + FileInputStreamFileImageInputStreamFileChannel + ByteBuffer ,甚至更多)。

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

public void seek(ByteArrayInputStream input, int position)
    throws IOException
{
    input.reset();
    input.skip(position);
}

当然,这假设没有人调用mark()

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM