2016-06-10 61 views
1

我有兩個單獨的程序NumberWriter.javalog.txt文件寫入了少量數字,並且CharWriter.javalog.txt文件寫入了少量數字。如果我同時運行這兩個程序(幾乎同時運行獨立於兩個不同的控制檯),那麼沒有錯誤或異常,即都運行成功。然後,我期待在log.txt文件中獲得文件內容混合的數字和字符,但只獲得任一個數字或字符。在同一文本文件上寫入Java多個程序

我完全沒有發現問題。任何幫助,將不勝感激。

NumberWriter.java

import java.io.IOException; 
import java.io.FileWriter; 
import java.lang.Exception; 

public class NumberWriter { 
    public static void main(String args[]) throws IOException, Exception{ 
     FileWriter fw = new FileWriter("log.txt"); 
     for (int i = 01; i < 10; i++) { 
      fw.append(String.valueOf(i) + "\r\n"); 
      System.out.println("NumberWriter: " + i); 
      Thread.sleep(1000); 
     } 
     fw.close(); 
     System.out.println("number write done!"); 
    } 
} 

CharWriter.java

import java.io.IOException; 
import java.io.FileWriter; 
import java.lang.Exception; 

public class CharWriter { 
    public static void main(String args[]) throws IOException, Exception{ 
     FileWriter fw = new FileWriter("log.txt"); 
     String s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
     for (int i = 01; i < 10; i++) { 
      fw.append(s.charAt(i) + "\r\n"); 
      System.out.println("CharWriter: " + s.charAt(i)); 
      Thread.sleep(1000); 
     } 
     fw.close(); 
     System.out.println("char write done!"); 
    } 
} 

log.txt的文件內容,同時運行兩個程序

要麼

B 
C 
D 
E 
F 
G 
H 
I 
J 

1 
2 
3 
4 
5 
6 
7 
8 
9 

編輯:這兩個程序都沒有異常和錯誤運行,所以我期待得到字符和數字的混合。什麼是我的理解滯後。

enter image description here

+0

我不認爲有任何這種保證併發寫入文件。 – biziclop

+0

@biziclop都在同一時間無一例外地運行。這就是爲什麼我期待數字和字符的混合。 – mmuzahid

回答

3

沒有錯誤。

所有現代操作系統都有一個文件系統寫鎖定,因此任何時候只有一個人/程序可以寫入該文件。如果你做一些調查,你會發現,當你同時運行,一個將失敗,並拋出IOException

+0

你的「理解」是「滯後」?那麼現在....你應該看到一個醫生... – specializt

+0

可能是從控制檯批處理文件中的另一個程序執行兩個?如果是這樣,如果你沒有從控制檯讀取進程的錯誤和錯誤流 – ControlAltDel

+0

@ mmuzahid,那麼你可能不會看到Exception,那麼這只是因爲第一個在第二個開始之前已經完成執行,然後第二個覆蓋第一個。要確認,添加'Thread.sleep(15000);'到你的主要方法的底部 – ControlAltDel

0

什麼可能是更接近你所尋找的是使用服務器/客戶端系統寫入到一個共享的JTextArea ,然後將其寫入文本文件

+0

沒有必要創建一個JTextArea。這將有助於的唯一原因是因爲所有Swing操作都是在單個線程上完成的 - UI線程。您可以通過正確使用排隊和線程來完成合並多個客戶端消息。 – ControlAltDel

1

目前尚不清楚會發生什麼。 Java和OS都會緩衝輸出,因此您不可能在有史以來看到交錯輸出。您只寫入10個字節,這些字節將在內存中緩存,並且在文件關閉之前不會實際寫入。

這是一個行爲依賴於多個移動部件(您的程序,Java I/O系統,OS)的交互並且沒有文件鎖定的領域,這種行爲是非確定性的。

我建議你修改代碼如下:每個程序,而不是10

    1. 寫10000行添加環內10ms的延遲,所以這兩個程序需要100秒的運行
    2. 同花順每次迭代的輸出

    這將導致實際重疊並讓您確定會發生什麼。

  • +0

    它不會導致重疊,因爲操作系統不會讓您同時從兩個進程寫入文件。看到我的回答 – ControlAltDel

    +0

    @JimGarrison現在問題是它覆蓋幾個字符的數字,反之亦然。每次跑步都會產生模糊的輸出。 – mmuzahid

    +0

    @ mmuzahid這就是爲什麼你不應該試圖從兩個獨立的進程寫入同一個文件。 – biziclop

    相關問題