簡體   English   中英

使用帶有append = false的FileOutputStream時如何避免間歇性的空行?

[英]How to avoid intermittent empty lines when using FileOutputStream with append = false?

以下代碼有時會使random.txt文件沒有內容:

final Random rand = new Random();

while (true) {
    try (FileOutputStream fos = new FileOutputStream("random.txt", false);
         PrintWriter pw = new PrintWriter(fos, true)) {
        pw.println(rand.nextLong());
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
}

這可以使用tail驗證:

$ tail -f random.txt
511109499422519327

-4120669548002912852
-6691981558077108749
-3630360891256027458
2917713483009724854
-5999569794311404435
-7616466037397807657
6997723694593334477
-7350203015863330163
1355067773463270538
-8140835511024500423
-2536681669468724500
-2926317178660145957
-6983787629710676243
7119127016459332336

7186294589323134873
-8389505833590104437
197327637272321424
-1458700265861408851
5685819798785563231
4060059342974359248
215297222019419003
2913123181036087590
-5940005294121482941
5658270253202816998

如您所見, tail輸出有兩個缺口。 發生這種情況是因為FileOutputStream(fileName, false)首先截斷文件,然后將新數據寫入其中。

因此,如果tail恰好在截斷時正在讀取文件的內容,則它會顯示一個空行。

除了使用涉及多個文件等的技術之外,是否有辦法確保截斷和寫入操作以原子方式發生?

除了使用涉及多個文件等的技術之外,是否有辦法確保截斷和寫入操作以原子方式發生?

在基本級別,截斷和文件寫入是兩個單獨的系統調用,操作系統不提供將兩個系統調用組合成原子操作(或事務)的方法。

如果你的目的是找到tail -f的邊緣情況,那么你就成功了。 否則,可能有更好/更有效的方法來執行您在此處嘗試執行的操作....例如寫入管道或附加到文件。 如果有一些特殊原因需要這樣做,請考慮過濾掉空白行。

實際上,我擔心這里可能會出現比偶爾空白線更嚴重的問題。 如果Java程序在tail讀取最后一行之前截斷文件,則可能還會丟失非空行。 (嘗試用遞增計數器的值替換rand.nextLong() ...並查看是否在tail輸出中看到所有數字。)

暫無
暫無

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

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