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

Where do you close a writer in TwitterStream?

我正在为信息检索编译一堆推文 class。我正在尝试通过 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),编写器将关闭当前文件并创建一个新文件。以下是相关的 class 函数:

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 class 创建了一个与 main 线程同时运行的新线程。然后,main 线程关闭流,twitterStream 无法再写入。

如果是这样,我应该在哪里关闭我的作家?

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

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