无法在java中读取以前写入的json数据(未终止的字符串错误)

efzxgjgh  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(329)

我正在使用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();
amrnrhlw

amrnrhlw1#

在通知读者之前,您可能需要刷新输出。否则部分字符串将保留在缓冲区中。

public void onStatus(Status status) {
        try{
            String jsonString = TwitterObjectFactory.getRawJSON(status);
            output.write(jsonString+"\n");
            output.flush();
            numTweets++;
            if(numTweets > 10){
                synchronized(lock){
                    lock.notify();
                }
            }
        }
        catch(IOException e){
            e.printStackTrace();
        }
    }
1mrurvl1

1mrurvl12#

我看不到你关好门的代码 BufferedWriter . 如果在第一个程序结束前不手动关闭它,那么数据可能会保留在内部缓冲区中,永远不会写入文件。
您也可以尝试在文本编辑器中打开文件并查看内容。工具,如http://codebeautify.org/jsonviewer 或者http://jsonlint.com/ 允许您验证/美化内容以查看错误。
最后,试试看 BufferedReader( new InputStreamReader( new FileInputStream(file), "UTF-8" ) ) . 输入中的非ascii字符可能会混淆 Scanner .

相关问题