簡體   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