2017-10-19 1 views
-1

私のJavaコードは、twitterのようなストリームデータを受け取ります。データを保存する必要があります。各ファイルごとに10000レコード。したがって、新しいファイルを作成してからデータを書き込むには、file writerbuffered writerを再作成する必要があります。java.io.IOException:ストリームが閉じられました。ストリームデータを複数のファイルに書き込む最善の方法は何ですか?

// global variables 
    String stat; 
    long counter = 0; 
    boolean first = true; 
    Date date; 
    SimpleDateFormat format; 
    String currentTime; 
    String fileName; 
    BufferedWriter bw = null; 
    FileWriter fw = null; 

    public static void main(String[] args) { 
     String dirToSave = args[0]; 
     String fileIdentifier = args[1]; 

     createFile(dirToSave, fileIdentifier); 

     StatusListener listener = new StatusListener() { 
      @Override 
      public void onStatus(Status status) { 
       stat = TwitterObjectFactory.getRawJSON(status); 

       try { 
        if(bw!=null){ 
         bw.write(stat + "\n"); 
        } 
       } catch (IOException ex) { 
        System.out.println(ex.getMessage()); 
       } 
       counter++; 

       if (counter == 10000) { 
        createFile(dirToSave, fileIdentifier); 
        try { 
         TimeUnit.SECONDS.sleep(5); 
        } catch (InterruptedException ex) { 
         System.out.println(ex.getMessage()); 
        } 
        counter = 0; 
       } 
      } 
     }; 

TwitterStream twitterStream = new TwitterStreamFactory(confBuild.build()).getInstance(); 

    twitterStream.addListener(listener); 

    // twitterStream.filter(filQuery); 
    } 

public static void createFile(String path, String fileIdentifier) { 
     date = new Date(); 
     format = new SimpleDateFormat("yyyyMMddHHmm"); 
     currentTime = format.format(date); 
     fileName = path + "/" + fileIdentifier + currentTime + ".json"; 

// if there was buffer before, flush & close it first before creating new file 
     if (!first) { 
      try { 
       bw.flush(); 
       bw.close(); 
       fw.close(); 
      } catch (IOException ex) { 
       Logger.getLogger(LocalFile_All_en.class 
         .getName()).log(Level.SEVERE, null, ex); 
      } 
     } else { 
      first = false; 
     } 

     // create a new file 
     try { 
      fw = new FileWriter(fileName); 
      bw = new BufferedWriter(fw); 
     } catch (IOException ex) { 
      Logger.getLogger(Stack.class 
        .getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

ただし、数時間後にはいつもエラーが発生します。

SEVERE: null 
java.io.IOException: Stream closed 

EDIT:エラーメッセージは、これらのコードは、私のコードの問題であり、どのようなエラーに

if (counter == 10000) { 
        createFile(dirToSave, fileIdentifier); 
... 

bw.flush(); 

を投げると言いますか?またはこのようなストリームデータを書き込むための良い方法がありますか?

+0

マルチスレッドプログラムですか? – Alex

+0

@Alexいいえ、それは1つのスレッドだけです。ストリームデータの受信とファイルへの格納。 –

+0

メソッド 'onStatus'はどのように呼び出されていますか?どの行が例外をスローしますか? – Alex

答えて

1

このエラーが現時点で発生していて、このエラーが発生した後に再度書き込むと、bwが閉じていて、まだ開かれていない可能性があります。onStatus()はフラッシュを書き込もうとします。

のでbwはnullでなく、閉じられていないことができます。何らかの形でクロージング/オープニングを同期させる必要があります。

例えば、onStatus()のようにしてください。ちょうどbwに直接書き込むのではなく、新しいファイルを閉じる/再オープンするコールバックがあります。

アップデート:このtwitterStreamが終了前の呼び出しを待つことなくonStatus()を呼び出すことができることをここ仮定。最初の呼び出しはストリームを閉じたばかりで、2番目の呼び出しはその書き込みの直後です。まれですが、長期間に渡って起こります。

アップデート2:これはflush()部分にも適用されます。

私はすでにも短いコメントとしてこれを追加しましたが、人々はしばしば、それが/デバッグを解決するのは難しいです、後で大きな問題を引き起こすことargumenting Javaで静的および特にグローバル静力学を取り除くために教えてください。これは良いケースかもしれません。また

読む:

Why are static variables considered evil?

Volatile Vs Static in java

後者はどのように同時要求をsychronizeする例があります。

関連する問題