2015-04-22 38 views
0

我正在編譯一大堆信息檢索類的推文。我試圖通過twitter4j使用REST API和Streaming API。當使用流API,我用下面的修改this example你在TwitterStream中關閉了一個作家?

final LimitedFileWriter output = new LimitedFileWriter("Tweets","tweets"); 
TwitterStream twitterStream = new TwitterStreamFactory(cb.build()).getInstance(); 
    StatusListener listener = new StatusListener() { 
     @Override 
     public void onStatus(Status status) { 
      try{ 
       output.write("@" + status.getUser().getScreenName() + " -- " + status.getText()+"\n"); 
      } 
      catch(IOException e){ 
       e.printStackTrace(); 
      } 
     } 
    } 

    twitterStream.addListener(listener); 
    twitterStream.sample("en"); 
    //output.close(); 

看來我不能永遠閉上​​我的作家。我正在使用的作者只是包裝BufferedWriter,同時跟蹤文件大小。如果文件超過特定大小(128MB),寫入程序將關閉當前文件並創建一個新文件。下面是相關類功能:

public void write(String s) throws IOException 
{ 
    if(bytesWritten + s.getBytes(charset).length >= MAXSIZE){ 
     output.close(); 
     bytesWritten = 0; 
     fileNum++; 
     String fileName = directory + "/" + baseName+fmt.format(fileNum); 
     currentFile = new File(fileName); 
     output = new BufferedWriter 
      (new OutputStreamWriter(new FileOutputStream(fileName),charset)); 
    } 

    output.write(s); 
    bytesWritten += s.getBytes(charset).length; 

} 

public void close() throws IOException{ 
    output.close(); 
} 

如果我嘗試twitterStream.sample()(註釋掉)後關閉作家,程序崩潰,因爲我試圖寫一個封閉的文件。如果我的理解是正確的,這是因爲TwitterStream類創建了一個與main線程同時運行的新線程。然後,main線程關閉流並且twitterStream不能再寫入它。

如果是這樣的話,我應該在哪裏關閉我的作家?

回答

1

如果我已經正確理解了你的問題,你希望能夠在某個時候關閉tweets集合,關閉你的打開文件編寫器並且有一個乾淨的退出。要實現它,你可以使用一個同步塊。

final Object lock = new Object(); 
final LimitedFileWriter output = new LimitedFileWriter("Tweets","tweets"); 
TwitterStream twitterStream = new TwitterStreamFactory(cb.build()).getInstance(); 
StatusListener listener = new StatusListener() { 
    @Override 
    public void onStatus(Status status) { 
     try{ 
     output.write("@" + status.getUser().getScreenName() + " -- " + status.getText()+"\n"); 
     // free the lock 
     if (some_condition_like_I_have_enough_files) { 
      synchronized (lock) { 
       lock.notify(); 
      } 
     } 
     catch(IOException e){ 
      e.printStackTrace(); 
     } 
    } 
} 

twitterStream.addListener(listener); 
twitterStream.sample("en"); 

try { 
    synchronized (lock) { 
     lock.wait(); 
    } 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
// close the twitterstream 
// close the writer