2013-05-04 64 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

相關問題