2012-11-21 57 views
3

我想將原始數據塊保存到一個文件中,並在稍後逐一讀取這些塊。這是沒有什麼大不了的,除了下面的疑問:如何在原始數據文件中使用塊分隔符?

什麼確切的字節用作分隔符,即識別一個塊的結束和下一個開始?鑑於塊數據也可能隨機包含這樣的字節序列。

備註:塊大小可變,包含隨機數據。他們實際上是jpeg圖像。

+2

如果您使用常量塊大小,則不需要分隔符。否則,您需要查找永遠不會存在於您的數據中的字節(或字節序列)。 – jlordo

+0

這就是問題塊的大小和隨機數據。 –

+0

如果您的數據不能包含彼此相鄰的兩個相同的字節,請將該信息用作變量分隔符。除此之外,我唯一的提示是每個塊一個文件。 – jlordo

回答

3

您可以首先將塊的長度作爲固定大小的值寫入文件,例如,一個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(...)寫入文件的原始名稱。您只需確保您以相同的順序編寫和讀取相同的數據。

1

創建第二個文件,在該文件中將塊的字節範圍保存在塊文件中,或者將該信息添加到塊文件的頭文件中。做過類似的事情,不要忘記,字節範圍比標題長度的附加偏移量要多。

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 
} 
相關問題