2013-08-28 87 views
1

我的應用程序解析一個大的http響應,http響應超過6兆字節,是json,但不是在標準架構。android java沒有足夠的順序內存的stringbuilder

 final char[] buffer = new char[0x10000]; 
     StringBuilder out = new StringBuilder(); 
     Reader in = new InputStreamReader(is, "UTF-8"); 
     int read; 
     System.gc(); 
     do 
     { 
      read = in.read(buffer, 0, buffer.length); 
      if (read > 0) 
      { 
       out.append(buffer, 0, read); 
      } 
     } while (read >= 0); 
     in.close(); 
     is.close(); 
     in = null; 
     is = null; 
     System.gc(); 
     return out.toString(); 

如果從一個文件,或者一個InputStream一個BufferedReader不要緊,StringBuilder的根本不能包含整個對象,並將其在out.append(buffer, 0, read);失敗或將在out.toString()失敗,因爲另一副本可以進行

IOUtils.copy來自apache庫在引擎蓋下做同樣的事情,它也會失敗。

如何讀取這個大對象進行進一步操作。此時此方法在Android 2.2和2.3設備上失敗,並且在較新的設備上使用的內存比我想要的要多。

類似的問題都有答案,包括追加到一個stringbuilder,閱讀行,或有不完整的解決方案,只是提示,這是行不通的。

回答

4

你需要做兩件事情之一:

  1. 從服務器獲取多個較小的JSON響應並解析這些。這在移動設備上可能更可取,因爲大量的數據可能無法可靠傳輸,這會導致設備反覆請求整個事件。
  2. 使用流JSON解析器,如Jackson,對數據進行處理,因爲它的用武之地。
+0

HM,使用傑克遜有關,這需要我重寫正被整個應用程序中使用我的整個HTTPGET方法。其次,這是否意味着這個api調用,我將需要一個對象,聲明每個變量?它也嵌套了對象 – CQM

+0

Jackson在同一個地方崩潰了,實際上是「java.lang.StringBuilder.toString(StringBuilder.java:663)」,因爲它似乎也在內部使用了字符串生成器! hm – CQM

+0

發佈你的代碼 - 你在使用Jackson的流媒體API嗎? – 323go

相關問題