2011-12-26 49 views
0

同じテキストファイルを同時に読み書きすることはできますか?同じファイルへの書き込みと読み取り

最初のスレッドはファイルにテキスト文字列を追加し、データがない場合は "ending"文字列を追加します。

2番目のスレッドは、そのファイルからデータを読み込み、新しいデータがある場合はブロックします。それは "終了"文字列を読むときに終了する必要があります。

public class TheFileReader implements Runnable { 


    public void run() { 

     FileInputStream is = null; 
     BufferedReader fbr = null; 
     File file = new File ("C:\\temp\\fileout3.txt"); 
     String s1 =""; 

     try {  
      fbr = new BufferedReader(new FileReader(file), 1024*1024); 

      while (s1.equals("exit")==false){ 
      s1 =fbr.readLine(); 
      if (s1==null){ 
       s1="";    
       Thread.sleep (50); 
      } 
      else 
       System.out.println(s1);   
      }   

     } catch (IOException e) {   
      e.printStackTrace(); 
     } catch (InterruptedException e) {  
      e.printStackTrace(); 
     } finally 
     { 
      try { 
       fbr.close();       
      } catch (IOException e1) { 

       e1.printStackTrace(); 
      } 
     } 

    } 

public class TheFileWriter implements Runnable { 

    public void run() { 

     FileOutputStream os = null; 
     BufferedWriter fbw = null; 
     File file = new File ("C:\\temp\\fileout3.txt"); 
     String s1 =""; 

     try {  
      fbw = new BufferedWriter(new FileWriter(file), 1024*1024); 
      for (int i = 0; i < 100; i++) { 
       fbw.write("test" + i); 
       fbw.newLine(); 
      } 
      fbw.write("exit"); 

     } catch (IOException e) {   
      e.printStackTrace(); 
     } finally 
     { 
      try { 
       fbw.close();       
      } catch (IOException e1) { 

       e1.printStackTrace(); 
      } 
     } 

    } 
    } 

UPDATE:

私はfbw.flush() after fbw.newLine();を追加する場合、私はそれが動作すると思います。

+0

データベースを設計しようとしているようです。代わりに本物のものを使いたいかもしれません。 – toto2

+0

次の質問と同じように見えます:http://stackoverflow.com/questions/8607169/file-reading-writing-using-multithreading/8607215#8607215 –

答えて

0

あなたは、あなたの中にBlockingQueueを使用するような何かをすることができます。そこに何かがあるまでそれをポーリングし、それを第2のスレッドのファイルに書き出します。最初のスレッドは、読み込まれたときにStringオブジェクトをキューにポップするだけです。

これを行うにはさらに複雑な方法がありますが、それは簡単で汚い方法です。あなたが本当に調整するために、ファイルを使用したい場合は、それを同期する方法と、サードパーティのオブジェクト内に存在するランダムアクセスファイルを作成

+0

私は理解できません。 2つのスレッドから同じファイル。 – omrid

+0

あなたは何を言っているのか分かります。あなたは本当にこれを2つのスレッドで行いたいですか?それはちょうど何かをする恐ろしい方法です。セマフォーとしてファイルを使用して前後にデータを渡そうとしている場合は、それも悪いことです。解決しようとしている問題についてより具体的に説明できますか? – Kylar

+0

そして、より暗くなるために、FileReaderとFileWriterを別のスレッドの同じファイルに開くことを止めるものはありませんが、ファイルに書き込むタイミングと方法によっては予期しない結果が得られます。ファイルを使用してデータ転送を調整しようとしているようです。 – Kylar

0

、あなたかどうかを判断するためにブール演算子を受け入れ

public synchronized String readWrite(boolean read, string writeStuff); 

を言います情報を読んだり情報を書いたりしたい次に、書きたいデータを含む2番目の文字列を渡します。代わりに読んだ場合は、戻り値を出力として使用してください。

関連する問題