2015-12-21 44 views
-1

我在我的代碼中做了什麼是簡單地追加一個標記,然後使用附加標記FileOutputStream將一些字符串數據附加到二進制文件。現在,我如何從指定的標籤開始閱讀?我不知道從哪裏開始。如何讀取從特定部分開始的二進制文件

文件和字符串大小是可變的,所以我不能真正相信它。唯一不變的是標籤。

編輯:我忘了提及該文件將從另一個線程/活動/應用程序/設備訪問。

String TAG = "CLIPPYDATA-"; 
String content = "The quick brown fox jumps over the lazy dog."; //size not fixed, sample purpose only. 

FileOutputStream output = new FileOutputStream("/path/to/file", true); 
try { 
     output.write((TAG + content).getBytes()); 
} finally { 
     //output.flush(); (should I?) 
     output.close(); 
} 

示例輸出::

yyvAžîéÃI&8QÀ Ø +ZŠ(¢Š(¢Š(ÿÙCLIPPYDATA-The quick brown fox jumps over the lazy dog. 

樣品輸入:

yyvAžîéÃI&8QÀ Ø +ZŠ(¢Š(¢Š(ÿÙCLIPPYDATA-The quick brown fox jumps over the lazy dog. 

所需的輸出:

用於附加一些數據

代碼

CLIPPYDATA-The quick brown fox jumps over the lazy dog. 
+0

你爲什麼不把標籤位置在文件結尾? – bladefury

+0

@bladefury爲什麼? – pandalion98

+1

如果你把標籤位置放在文件的末尾,比方說最後8個字節。那麼你可以這樣做:讀取最後8個字節 - >獲取標籤的位置 - >尋找位置 - >讀取標籤和內容 – bladefury

回答

0

正如意見中討論,這裏是一個例子:

的附加數據:

String TAG = "CLIPPYDATA-"; 
    String content = "The quick brown fox jumps over the lazy dog."; //size not fixed, sample purpose only. 
    File outputFile = new File("/path/to/file"); 
    long fileLength = outputFile.length(); 
    FileOutputStream output = new FileOutputStream(outputFile, true); 
    try { 
     output.write((TAG + content).getBytes()); 
     byte[] bytes = ByteBuffer.allocate(Long.SIZE/Byte.SIZE).putLong(fileLength).array(); 
     output.write(bytes); 
    } finally { 
     //output.flush(); (should I?) 
     output.close(); 
    } 

讀取數據:

RandomAccessFile raf = new RandomAccessFile("/path/to/file", "rb"); 
    long endPositon = raf.length() - Long.SIZE/Byte.SIZE; 
    // get last 8 bytes 
    raf.seek(endPositon); 
    long tagPosition = raf.readLong(); 
    raf.seek(tagPosition); 
    byte[] bytes = new byte[endPositon - tagPosition]; 
    raf.read(bytes); 
    String appendedData = new String(bytes); 
    if (appendedData.startsWith(TAG)) { 
     // appendedData is what you want 
    } 
+0

@ PandaLion98很難看出這是如何解決你的問題,除非只有一個追加。 – EJP

1

只是seek()到你寫標籤的地方。

編輯'你寫標籤的地方'是在寫它之前由文件大小給出的。

+0

問題是偏移是可變的。 – pandalion98

+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 - [來自評論](/ review/low-quality-posts/10634271) – developer

+0

@ PandaLion98沒關係,'seek()'接受一個整數,它可以是一個變量。 – EJP

相關問題