我想將原始數據塊保存到一個文件中,並在稍後逐一讀取這些塊。這是沒有什麼大不了的,除了下面的疑問:如何在原始數據文件中使用塊分隔符?
什麼確切的字節用作分隔符,即識別一個塊的結束和下一個開始?鑑於塊數據也可能隨機包含這樣的字節序列。
備註:塊大小可變,包含隨機數據。他們實際上是jpeg
圖像。
我想將原始數據塊保存到一個文件中,並在稍後逐一讀取這些塊。這是沒有什麼大不了的,除了下面的疑問:如何在原始數據文件中使用塊分隔符?
什麼確切的字節用作分隔符,即識別一個塊的結束和下一個開始?鑑於塊數據也可能隨機包含這樣的字節序列。
備註:塊大小可變,包含隨機數據。他們實際上是jpeg
圖像。
您可以首先將塊的長度作爲固定大小的值寫入文件,例如,一個4個字節的整數,然後是數據本身:
public void appendChunk(byte[] data, File file) throws IOException {
DataOutputStream stream = null;
try {
stream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file, true)));
stream.writeInt(data.length);
stream.write(data);
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
// ignore
}
}
}
}
如果以後要讀的塊從該文件回來,你讀出第1塊的長度開始。您現在可以決定是讀取塊數據,還是跳過它並繼續下一個塊。
public void processChunks(File file) throws IOException {
DataInputStream stream = null;
try {
stream = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
while (true) {
try {
int length = stream.readInt();
byte[] data = new byte[length];
stream.readFully(data);
// todo: do something with the data
} catch (EOFException e) {
// end of file reached
break;
}
}
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
// ignore
}
}
}
}
您還可以添加其他元數據對塊,像stream.writeUTF(...)寫入文件的原始名稱。您只需確保您以相同的順序編寫和讀取相同的數據。
創建第二個文件,在該文件中將塊的字節範圍保存在塊文件中,或者將該信息添加到塊文件的頭文件中。做過類似的事情,不要忘記,字節範圍比標題長度的附加偏移量要多。
int startbyte = 0;
int lastByte = 0;
int chunkcount = 0;
File chunkfile;
File structurefile;
for (every chunk) {
append chunk to chunkfile
lastByte = startByte + chunk.sizeInBytes()
append to structurefile: chunkcount startByte lastByte
chunkcount++;
startByte = lastByte + 1
}
如果您使用常量塊大小,則不需要分隔符。否則,您需要查找永遠不會存在於您的數據中的字節(或字節序列)。 – jlordo
這就是問題塊的大小和隨機數據。 –
如果您的數據不能包含彼此相鄰的兩個相同的字節,請將該信息用作變量分隔符。除此之外,我唯一的提示是每個塊一個文件。 – jlordo