簡體   English   中英

如何同時寫和讀文件

[英]How to write and read to file reactively in the same time

有人知道在Java中讀寫文件(xml,json)的方法,其中java對象將能夠以響應方式存儲在文件中。

現在,我使用com.fasterxml.jackson.core.JsonGenerator將對象寫入json文件。

為了讀取文件,我使用com.fasterxml.jackson.core.JsonParser

但我無法同時讀寫文件。 我不想有很多打開/關閉文件描述符操作。

用Java做到的方式?

我的業務場景:

我從一個大文件(多於幾個GB)讀取記錄,並且需要在記錄之間創建關系。 不幸的是,輸入文件中的記錄不會進行排序,並且當所有記錄都處於完美順序時,就無法寫入排序文件。

我遍歷輸入文件並找到parent record並希望在創建記錄之間的記錄時將記錄寫入第二個文件。

在第二個步驟,我想寫child record ,但我需要遍歷record relations file (閱讀開放寫入描述符文件操作),我需要找到找到parent record我的child record和更新父記錄時,我填child structure ,其中插入child_1 element示例結構,我現在正在使用:

{
"parent_1": {
...
childs: [{
"child_1": { ... } 
}]
}
}

您對問題的描述不是很清楚,我們不知道您為什么要這樣做以及您想要實現什么 但我會嘗試:

如果您嘗試像JavaScript中的React.js一樣執行操作,則需要程序監視文件是否已更改,並通過更新相應的對象來對此做出反應 但這不是很有效(也沒有多大意義)-也許僅在對象類中使用靜態字段來維護實例之間的狀態就可以解決問題? 如果這完全適用於您的情況...

我將使用文件的修改時間(或json中正在運行的版本號/ UUID)完整地加載和保存文件。

對於多個文件,可能需要多次訪問同一文件,需要一個管理類。

Files類對於加載/保存很有用。

Path path = Paths.get("...");
FileTime t = Files.getLastModified(path);
byte[] data = Files.readAllBytes(path);
FileTime tcheck = Files.getLastModified(path);
ByteArrayInputStream bais = ...

通過這種方式,訪問盡可能地是原子/短暫的。

理想情況下,可以使用FileLock.lock() ,但對於隨機訪問的文件,文件通道(尤其是帶有緩沖區的文件FileLock.lock() ,則更多。 例如,如果json文件確實很大。 但是,json格式本身並不足夠。

我認為針對我的情況的最佳解決方案是:

  • 讀取父記錄並為他找到所有子記錄(存儲在內存中),並在到達文件末尾后將我的父記錄+子記錄刷新到relations_file
  • 讀寫最佳方法將使用FileChannel

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM