繁体   English   中英

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

[英]How to read parts of binary file again if DataInputStream does not support mark/reset

我需要通过传递索引来读取结构化二进制文件的一部分。 但是,DataInputStream不支持标记/重置。 我怎样才能实现我的目标? 还有其他课程可以让我轻松实现这一目标吗?

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();
    }
  }
}

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

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

此外,我不完全确定,但从我的理解,你可能会错误地使用标记的参数。 根据JavaDoc,参数意味着:

标记位置变为无效之前可读取的最大字节数限制。

因此,使用参数零调用标记将不是特别有用。

在BufferedInputStream中包装它实现mark

btw你的标记调用应该给出你希望读取的字节数,直到重置发生。 如果您读过去标记变为无效并且重置将抛出

或使用RandomAccessFile

暂无
暂无

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

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