你在哪里关闭TwitterStream中的作家?

时间:2015-04-22 23:21:04

标签: java twitter4j

我正在为信息检索课编写一堆推文。我正在尝试通过twitter4j使用REST API和Streaming API。使用Streaming API时,我对this example使用了以下修改:

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 个答案:

答案 0 :(得分:1)

如果我已正确理解您的问题,您希望能够在某个时刻关闭推文集合,关闭您的打开文件编写器并清除退出。要实现它,您可以使用同步块。

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