gpt4 book ai didi

java - 是否有任何有效的方法可以找到文件中特定 4 字节 block 的所有实例的第一个字节?

转载 作者:行者123 更新时间:2023-12-04 05:44:12 24 4
gpt4 key购买 nike

我有包含存档二进制消息的文件。一个小文件大约 600MB,包含近 9000 条消息。每条消息都以我知道的一个特定的四字节标志开始,它表示消息头的前四个字节(因此必须被捕获)。消息头是所有消息的固定大小。消息 header 后跟在 header 中标识的大小的有效负载。一旦找到特定消息头的开头,我就知道到头的末尾有多少字节,并且可以使用它来提取消息中的字节数,我需要解析此存档文件并隔离每条消息以进行处理,确保我包含从四字节标志的第一个字节到指定消息长度的末尾的所有字节。不同的消息之间有一些填充。

由于文件的大小,我不想(并且可能不能在所有情况下)将文件作为单个数组使用。因此,我正在查看类似 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 中的二进制数据或任何特别适合我的问题的方法?

最佳答案

使用 java.nio.channels.FileChannel 扫描文件 它使用较少的中间副本将文件映射到内存。
benchmark of alternatives

关于java - 是否有任何有效的方法可以找到文件中特定 4 字节 block 的所有实例的第一个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10899509/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com