有沒有某種方法可以在unix上打開一個阻塞的文件進行寫入(在完成“寫入”操作之前實際上等待數據進入文件?我有一個程序,它從列表中獲取結果行并將它們寫入文件中。我當前的實現如下(我刪除了每行完成的處理) ArrayList<String> lines = new ArrayList<>(); BufferedReader in = new BufferedReader(new FileReader(inFile)); String line; while((line = in.readLine()) != null){ lines.add(line); } int written = 0; PrintWriter out = new PrintWriter(new FileWriter(outFile)); for(String l : lines){ written++; out.println(l); if(written % 10000 == 0) Message.info("lines written "+written); } out.close();當前行為如下:[17:12:43 INFO ] 行寫入 10000[17:12:43 INFO ] 行寫入 20000[17:12:43 INFO ] 行寫入 30000[17:12:44 INFO ] 行寫入寫入 40000[17:12:44 INFO ] 行寫入 50000[17:12:44 INFO ] 行寫入 60000[17:12:45 INFO ] 行寫入 70000[17:12:45 INFO ] 行寫入 80000[17:12: 45 INFO ] 寫入 90000 行[17:12:46 INFO ] 寫入 100000 行程序運行速度非常快,但最后等待(30-40秒)所有數據(4Go)寫入文件才結束。(在此期間我可以看到文件在磁盤上增長)當我想要的時候,只有當數據確實在文件中時才顯示我的信息消息:程序看起來會更慢,但會在最后一個之后立即結束信息。我嘗試使用 BufferedWriter (來自 new BufferedWriter() 和 Files.newBufferedWriter())、FileOutputStream、OutputStream,但所有這些似乎都只建議非阻塞 IO 操作該程序在 Ubuntu 上運行(我讀到該實現依賴于文件系統)那么,有什么方法可以在執行下一行代碼之前等待 println()/write() 操作完成嗎?我“感覺”java將實際寫入委托給操作系統,并且不等待數據在磁盤上繼續,但由于java在退出之前等待最后一次寫入完成,因此必須有一個每行之后的等待方式
1 回答

幕布斯6054654
TA貢獻1876條經驗 獲得超7個贊
骯臟的解決方法:每 10,000 行,我關閉文件并使用StanddardOpenOption.APPEND
.
這具有預期的行為,并且只有可接受的時間開銷。
干凈的解決方案:使用“StanddardOpenOption.SYNC”打開文件。
這具有預期的行為,但時間開銷很大
添加回答
舉報
0/150
提交
取消