我正在使用twitter4j软件包进行信息检索,并收集了一些tweet。不过,在下一部分的作业中,我将使用lucene对tweets进行索引。为了做到这一点,我的想法是将tweet作为json字符串保存到一个文件中,然后在需要时重新读取它们。但是,我遇到了一个错误。
当文件被写入时,我可以很好地看到整个json对象。整个对象相当大(2500个字符)。然而,当我从文件中读回来时,我得到了一个 Unterminated string at x
错误。我使用twitterobjectfactory方法来编写和读取字符串。以下是示例代码:
写作:
public void onStatus(Status status) {
try{
String jsonString = TwitterObjectFactory.getRawJSON(status);
output.write(jsonString+"\n");
numTweets++;
if(numTweets > 10){
synchronized(lock){
lock.notify();
}
}
}
catch(IOException e){
e.printStackTrace();
}
}
阅读:
Scanner input = new Scanner(file);
while(input.hasNext()){
Status status = TwitterObjectFactory.createStatus(input.nextLine());
System.out.println(status.getUser().getScreenName());
}
这只在某些时候起作用。如果我多次运行该程序并收到许多tweet,那么在从文件中读取2-3条tweet之后,程序几乎总是崩溃,并且总是出现相同的错误。如果您想复制代码,可以按照以下示例进行操作。我添加了一个synchronized块,以便在发出10条tweet后关闭流,但不必复制错误。
有人能解释一下发生了什么事吗?我猜我将json编码到文件中的方式有问题。我在用 BufferedWriter
Package OutputStreamWriter
以便以utf-8格式输出。
编辑:我确实关闭了流。下面是代码的底部片段:
twitterStream.addListener(listener);
twitterStream.sample("en");
try{
synchronized(lock){
lock.wait();
}
}
catch(InterruptedException e){
e.printStackTrace();
}
twitterStream.clearListeners();
twitterStream.cleanUp();
twitterStream.shutdown();
output.close();
2条答案
按热度按时间amrnrhlw1#
在通知读者之前,您可能需要刷新输出。否则部分字符串将保留在缓冲区中。
1mrurvl12#
我看不到你关好门的代码
BufferedWriter
. 如果在第一个程序结束前不手动关闭它,那么数据可能会保留在内部缓冲区中,永远不会写入文件。您也可以尝试在文本编辑器中打开文件并查看内容。工具,如http://codebeautify.org/jsonviewer 或者http://jsonlint.com/ 允许您验证/美化内容以查看错误。
最后,试试看
BufferedReader( new InputStreamReader( new FileInputStream(file), "UTF-8" ) )
. 输入中的非ascii字符可能会混淆Scanner
.