【问题标题】:Seeking a ByteArrayInputStream using java.io使用 java.io 寻找 ByteArrayInputStream
【发布时间】:2011-04-17 02:30:18
【问题描述】:

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

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

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

这是我第一次尝试使用 Java IO 类,结果完全是负面的。它缺少一些基本 (IMO) 功能,并且它有很多方法可以做同样的事情(例如,从文件中读取原语,您可以使用 RandomAccessFileDataInputStream + FileInputStreamFileImageInputStream、@987654340 @ + ByteBuffer,甚至更多)。

【问题讨论】:

  • 你觉得使用seek有什么问题吗?
  • @Vilay Mathew:什么seek 方法?我在 ByteArrayInputStream 上没有看到任何内容。
  • Java 中的文件 i/o 非常混乱。我把它教给一年级的学生,并试图让它变得简单,但这总是让人困惑。

标签: java io stream nio


【解决方案1】:

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

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

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

【讨论】:

  • 如果不调用标记,则标记位置的默认值为0,因此调用reset将指针移动到0,然后skip函数将指针移动到给定位置
  • @SumitKumarSaha:是的......我不确定你的评论的意义。
  • 我只是在总结你的答案
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      相关资源
      最近更新 更多