我有包含存档二进制消息的文件。一个小文件大约 600MB,包含近 9000 条消息。每条消息都以我知道的一个特定的四字节标志开头,它指示消息头的前四个字节(因此必须捕获)。消息头是所有消息的固定大小。消息头后跟一个大小在头中标识的有效负载。一旦我找到了特定消息头的开头,我就知道该头的末尾有多少字节,并且可以使用它来提取消息中我需要解析此存档文件并隔离每条消息以进行处理的字节数,确保我包含从四字节标志的第一个字节到指定消息长度结尾的所有字节。不同的消息之间有一些填充。
由于文件的大小,我不想(并且可能在所有情况下都不能)将文件作为单个数组使用。因此,我正在研究诸如 and 之类的RandomAccessFile
东西FileInputStream
。扫描文件以查找特定的字节序列,然后从该序列中的第一个字节开始通过已知长度获取每个字节,这似乎不是一项简单的任务。RandomAccessFile
,尤其是read(byte[])
和seek()
方法似乎可以让我实现解决方案。
给出一个想法,我当前的实现涉及一个名为的方法,该方法findFlag()
在RandomAccessFile
. 它寻找那个位置并读取从那里开始的四个字节。如果找到标志,则返回startPos
. 否则,它会递归调用自己,移动到startPos + 1
并重复,直到找到标志。由于我知道作为数据消息的一部分读取的最后一个字节,因此我将开始在那里寻找:
file.seek(startPos);
byte[] possibleFlag = new byte[4];
file.read(possibleFlag, 0, possibleFlag.length);
if (Arrays.equals(ByteUtils.intToBytes(Message.FLAG), possibleFlag)) {
return startPos;
}
else {
return findFlag(startPos + 1);
}
我是否忽略了 Java(Java 6 或更早版本)或经过良好测试的外部库(例如 Apache 库或类似库)中的某些内容?如果没有,是否有更好的解决方案来处理 Java 中的二进制数据或任何特别适合我的问题的方法?