你在哪里关闭 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
我正在为信息检索编译一堆推文 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