使用java.io寻找ByteArrayInputStream

时间:2010-09-25 06:21:38

标签: java io stream nio

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

如果使用java.io无法完成,我必须切换到java.nio并使用ByteBuffer,我怎样才能获得与DataOutputStream包装类似的内容ByteArrayOutputStream使用java.nio?我找不到任何可自动调整大小的缓冲区。

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

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

3 个答案:

答案 0 :(得分:10)

您使用reset() / skip()。我不能说这是世界上最好的API,但它应该有效:

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

当然,这假设没有人打电话给mark()

答案 1 :(得分:4)

如果您要创建要传递到其他地方的ByteArrayInputStream,请按照您的意愿扩展该类并操纵posprotected成员ByteArrayInputStream)。

答案 2 :(得分:1)

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

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