java - 如果 DataInputStream 不支持标记/重置,如何再次读取二进制文件的部分内容

标签 java file binary datainputstream

我需要通过传递索引来读取结构化二进制文件的一部分。但是,DataInputStream 不支持标记/重置。我怎样才能达到我想要的?是否有任何其他类(class)可以让我轻松实现这一目标?

import java.io.*;
import java.io.DataOutputStream;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;

class Test {
  public static int getInt(DataInputStream stream, int index) throws IOException {
    int offset = index * 4; // size of int
    stream.reset();
    stream.skip(offset);
    return stream.readInt();
  }

  public static void main(String[] args) {
    String filename = "test.data";
    try {
      DataOutputStream ostream = new DataOutputStream(new FileOutputStream(filename));
      for (int i=0; i<10; i++) {
        ostream.writeInt(i);
      }
      ostream.close();

      DataInputStream istream = new DataInputStream(new FileInputStream(filename));
      istream.mark(0);
      int i0 = getInt(istream, 0);
      int i3 = getInt(istream, 3);
      int i5 = getInt(istream, 5);
      System.out.printf("i0 = %d, i3 = %d, i5 = %d\n", i0, i3, i5);
      istream.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

最佳答案

不支持mark/reset的不是DataInputStream。 DataInputStream 只是将对标记/重置的调用委托(delegate)给底层流(在本例中为 FileInputStream)。然而,FileInputStream 不支持标记/重置操作 (iirc)。这个问题的解决方案是先将 FileInputStream 包装在 BufferedInputStream 中,然后再将其传递给 DataInputStream。这应该可以使用所需的操作。即:

DataInputStream istream = new DataInputStream(new BufferedInputStream(new FileInputStream(filename)));

此外,我不完全确定,但据我了解,您可能错误地使用了 mark 的参数。根据 JavaDoc,参数意味着:

the maximum limit of bytes that can be read before the mark position becomes invalid.

因此,使用参数零调用 mark 不会特别有用。

关于java - 如果 DataInputStream 不支持标记/重置,如何再次读取二进制文件的部分内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8099206/

相关文章:

java - 将 int 从位的十进制表示形式转换为 native 位,而不使用 String? ( java )

java - ExpandableListView展开后组项乱序

java - 为什么不同的 LayoutInflater 会导致不同的 SearchView Icon

java - IntelliJ 结构搜索和替换问题

java - 如何打开整个MP3目录?

python - 使用控制台启动程序时无法写入文件

java - Float.floatToRawIntBits(); 是什么意思?在java中返回?

java - 为什么我的八进制到十进制转换器在某些情况下不起作用?

java - 使用 HQL 在 map 中搜索

java - ARM 无法正确关闭文件,最终导致打开文件过多