使用 Java 读取结构化二进制文件的最佳方式

2022-08-31 20:10:01

我必须使用Java以旧格式读取二进制文件。

简而言之,该文件具有一个由几个整数,字节和固定长度的char数组组成的标头,后跟一个记录列表,该列表也由整数和char组成。

在任何其他语言中,我都会创建s(C / C++)或s(Pascal / Delphi),它们是标头和记录的逐字节表示。然后,我将字节读入标头变量中,并对记录执行相同的操作。structrecordsizeof(header)

像这样:(德尔福)

type
  THeader = record
    Version: Integer;
    Type: Byte;
    BeginOfData: Integer;
    ID: array[0..15] of Char;
  end;

...

procedure ReadData(S: TStream);
var
  Header: THeader;
begin
  S.ReadBuffer(Header, SizeOf(THeader));
  ...
end;

用Java做类似事情的最好方法是什么?我是否必须单独读取每个值,或者有没有其他方法可以执行这种“块读取”?


答案 1

据我所知,Java强制您将文件作为字节读取,而不是能够阻止读取。如果你正在序列化Java对象,那将是一个不同的故事。

所示的其他示例将 DataInputStream 类与 File 一起使用,但您也可以使用快捷方式:RandomAccessFile 类:

RandomAccessFile in = new RandomAccessFile("filename", "r");
int version = in.readInt();
byte type = in.readByte();
int beginOfData = in.readInt();
byte[] tempId;
in.read(tempId, 0, 16);
String id = new String(tempId);

请注意,您可以将响应对象转换为类,如果这样可以简化的话。


答案 2

如果您要使用Preon,那么您所要做的就是:

public class Header {
    @BoundNumber int version;
    @BoundNumber byte type;
    @BoundNumber int beginOfData;
    @BoundString(size="15") String id;
}

完成此操作后,您可以使用一行创建编解码器:

Codec<Header> codec = Codecs.create(Header.class);

你使用编解码器是这样的:

Header header = Codecs.decode(codec, file);