我有包含存檔二進制消息的文件。一個小文件大約600MB,包含近9000條消息。每條消息都以我知道的特定四字節標誌開始,它表示消息標題的前四個字節(因此必須被捕獲)。消息標題是所有消息的固定大小。消息頭後跟一個在頭中標識的大小的有效載荷。一旦找到特定消息頭的開頭,我就知道頭的末尾有多少個字節,並可以用它來提取消息中的字節數,我需要解析這個存檔文件並隔離每個消息以進行處理,確保包含從四字節標誌的第一個字節到指定消息長度結束的所有字節。消息之間有一些填充不同。是否有任何有效的方法來查找文件中特定4字節塊的所有實例的第一個字節?
由於文件的大小,我不希望(也可能無法在所有情況下)將該文件作爲單個數組使用。因此,我正在尋找像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 6中或更早),或在一個屢試不爽的外部庫(如Apache庫或類似的)?如果不是,是否有更好的解決方案來處理Java中的二進制數據或者任何特別適合我的問題的方法?
你看過http://stackoverflow.com/questions/644737/are-there-any-java-frameworks-for-binary-file-parsing? Preon似乎是你可能考慮的事情。 – Ewald
@Ewald不知道Preon會有多大幫助。在我將這些信息隔離之前,我正在閱讀的文件沒有一致的格式。唯一給出的事實是相同的四字節序列表示文件中每條消息的開始。 –
我認爲,*你喜歡的東西*很有效。只要讀取字節流檢查標記字節等。你還想要什麼? – Torious