我尝试在Java中写入Json格式,但在文件大小> 1GB时遇到NullPointerException。任何人都可以帮我解决这个问题吗?
代码不断生成Json文件,文件大小不断增加。一旦文件大小> 1GB,代码抛出异常,如下所示。我使用不同的数据集进行测试,所以我不认为这是数据问题。我的猜测是Java中的Gson.toJson有一个大小限制。
我的代码是:
private HashMap<String,HashSet<Token>> tokenCounter = new HashMap<String,HashSet<Token>>();
....
private void writeToFile(){
try {
PrintWriter out = new PrintWriter(outputFileName);
out.println(gson.toJson(tokenCounter));
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
它抛出的例外是:
java.lang.NullPointerException
at java.lang.String.<init>(String.java:301)
at java.lang.StringBuffer.toString(StringBuffer.java:790)
at java.io.StringWriter.toString(StringWriter.java:204)
at com.google.gson.Gson.toJson(Gson.java:481)
at com.google.gson.Gson.toJson(Gson.java:460)
at com.ebay.classification.discovery.DailyDiscovery.writeToFile(DailyDiscovery.java:181)
at com.ebay.classification.discovery.DailyDiscovery.run(DailyDiscovery.java:169)
at com.ebay.classification.discovery.TestDailyDiscoveryContinue.run(TestDailyDiscoveryContinue.java:142)
at com.ebay.classification.discovery.TestDailyDiscoveryContinue.main(TestDailyDiscoveryContinue.java:245)
答案 0 :(得分:3)
发布作为回答以解决评论中的格式问题。
2 ^ 30个字符的数组将是2 ^ 31个字节。作为单个字符串,这是巨大的!需要提出的一个显而易见的问题是您拥有代码的原因:
PrintWriter out = new PrintWriter(outputFileName);
out.println(gson.toJson(tokenCounter));
out.close();
这很容易写成:
FileWriter out = new FileWriter(outputFileName);
gson.toJson(tokenCounter, out);
out.flush();
out.close();
这不会对内存产生重大影响,而且会更快。
这并没有回答为什么你在大型StringWriter中获得NPE的问题,但是,坦率地说,你所做的事情是荒谬的......