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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (29)

我必须用Java读取传统格式的二进制文件。

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

在任何其他语言中,我将创建structs(C / C ++)或records(Pascal / Delphi),它们是标题和记录的逐字节表示。然后我将sizeof(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的最佳方式?我是否必须自己阅读每一个值,或者是否有其他方式来做这种"block-read"?

提问于
用户回答回答于

据我所知,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);

请注意,您可以将响应对象转换为一个类,如果这样会更容易。

用户回答回答于

你可以使用DataInputStream类如下:

DataInputStream in = new DataInputStream(new BufferedInputStream(
                         new FileInputStream("filename")));
int x = in.readInt();
double y = in.readDouble();

etc.

一旦你得到这些价值观,你可以随心所欲地做。查找API中的java.io.DataInputStream类获取更多信息。

扫码关注云+社区