Как снова прочитать части двоичного файла, если DataInputStream не поддерживает метку / сброс - PullRequest
1 голос
/ 11 ноября 2011

Мне нужно прочитать раздел структурированного двоичного файла, передав индекс.Однако 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();
    }
  }
}

Ответы [ 2 ]

3 голосов
/ 12 ноября 2011

Это не DataInputStream, который не поддерживает маркировку / сброс. DataInputStream просто делегирует вызовы для маркировки / сброса базовому потоку (в данном случае FileInputStream). Однако FileInputStream не поддерживает операции метки / сброса (iirc). Решение этой проблемы заключается в том, чтобы сначала обернуть FileInputStream в BufferedInputStream, а затем передать его в DataInputStream. Это должно позволить использовать нужные операции. То есть:

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

Кроме того, я не совсем уверен, но насколько я понимаю, вы могли неправильно использовать аргумент для mark. Согласно JavaDoc аргумент означает:

максимальный предел байтов, который может быть прочитан до того, как позиция метки станет недействительной.

Таким образом, вызов метки с нулевым аргументом не будет особенно полезным.

1 голос
/ 12 ноября 2011

Обтекание в BufferedInputStream, которое реализует отметку

Между прочим, ваш запрос метки должен дать количество байтов, которое вы ожидаете прочитать, пока не произойдет сброс. если вы прочитаете, что отметка становится недействительной, а сброс приведет к

или используйте RandomAccessFile

...