2014-03-04 38 views
0

我試圖用MappedMemoryBuffer從文件中存儲/刪除部分字節。 Atm中,我使用了以下方法:我在緩衝區中有一個位置標記文件中的數據結尾(緩衝區比文件稍大一些以容納追加)。每個數據塊都是固定長度的,比方說200個字節。Java NIO - 截斷MappedByteBuffer

我首先關心的是文件末尾的「標記」。我可以看到兩種方法:

  1. 使用某種標記來表示實際數據的結束,而文件大小可能更大(由於我爲了追加原因而保持略大一點)。想出一些獨特的字節序列可能會很棘手。
  2. 務必確保我們讀入的文件是「完整的」,即如果該文件是2000字節,這意味着它中有10條消息,僅此而已。這是更加棘手我想,我們必須不斷地截斷文件大小和開放的內存緩衝區是相當繁瑣(一個不能截斷開放的內存映射文件的文件大小)

這就是爲什麼我會瘦更多的是針對某個人,除非有人知道更好的方法?

現在,雖然追加很簡單,但刪除隨機數據塊並不那麼簡單。我想要做的是將數據轉移到覆蓋已刪除的消息。我只是將所有字節移動到消息的右側,直到它的開頭。

一般來說,這是正確的策略,還是會有人提出其他的或改進的概念?

+0

移動文件中的數據是一個壞主意。如果塊的順序不重要,可以將最後一塊移動到已刪除塊的位置(因爲塊的大小相同)。否則,你應該添加一種方法來將塊標記爲刪除並清除,一旦你有明顯稀疏的塊。 – Holger

+0

由於性能原因或更多,正在改變? – Bober02

+0

主要表現。但它也與您的意圖是安全的,當你的應用程序在操作之間中斷時。 – Holger

回答

0

你可以在FileChannel(或File或其他什麼,只要你知道它是你的文件)上使用自定義包裝類,並讓它提供映射,甚至可以自己寫映射。

在這門課上,跟蹤大小。使其實現Closeable。而當你.close()它,取消一切,並截斷/擴大到適當的大小。

+0

主要關心的是,jvm可能會崩潰,並且文件將處於不一致的狀態,因此有一種方法可以不斷標記文件的結尾(使用標記爲I上述)似乎更安全 – Bober02

+0

好吧,考慮到你的文件的大小(相當小),你也可以讓這個類寫入臨時文件並在'close()'上重命名爲原始文件。 – fge