2013-05-04 32 views
6

我试图用Java写入Json格式,但当文件大小> 1GB时遇到NullPointerException。任何人都可以帮助我解决这个问题吗?当文件大小大于1GB时,Gson.toJson抛出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

奇怪,堆栈跟踪指示'的char []'从传递['StringBuffer.toString'](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/lang/StringBuffer.java#StringBuffer.toString%28% 29)是'空'... – 2013-05-04 23:44:20

+0

是的,我也觉得有点奇怪。我尝试了几个不同的数据集,并且在1GB点出现相同的异常: – Long 2013-05-04 23:51:19

+0

@jlordo这似乎是不可能的,因为数组创建需要一个“int”参数。 int可以溢出,但会抛出'NegativeArraySizeException'。 – 2013-05-04 23:57:46

回答

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,不过,坦率地说,你在做什么是荒谬的....

+0

谢谢!这解决了问题!但出现了一个新问题:我使用BufferedReader读取文件,并再次抛出java.lang.NullPointerException:在java.lang.StringBuffer.ensureCapacityImpl(StringBuffer.java:335) \t at java.lang.StringBuffer.append (StringBuffer.java:111) \t在java.io.BufferedReader.readLine(BufferedReader.java:309) \t在java.io.BufferedReader.readLine(BufferedReader.java:373) – Long 2013-05-05 00:59:58

+0

的BufferedReader在新=的BufferedReader(新的FileReader (查找inputfilename)); \t \t \t串线= “” \t \t \t而((行= in.readLine())!= NULL)... – Long 2013-05-05 01:02:18

+1

@龙 - 我的猜测是,你有类似的荒谬到你原来的问题;例如您正在尝试将文件加载到字符串中并解析字符串,而不是直接从输入流中解析。基本上,Java字符串和字符串缓冲区不能包含超过MAX_INT个字符。在一个巨大的字符串中缓冲文件内容不会扩展......并且不合理。 – 2013-05-05 01:13:12

相关问题