我正在为信息检索课编写一堆推文。我正在尝试通过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
无法再写入。
如果是这样的话,我应该在哪里关闭我的作家?
答案 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