2014-05-24 48 views
3
數據丟失

這裏有什麼問題StringBuilder的時轉換爲字符串

我有問題,當我試圖從我的StringBuilder獲取字符串

BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()), 128 * 1024); 
StringBuilder dataResponseSB = new StringBuilder(); 
String line ; 
while ((line = reader.readLine()) != null) { 
    dataResponseSB.append(line); 
    if (DataFactory.DEBUG_MODE) { 
     // all data here are complete 
     Log.i("===LoadDataActivity","line: "+line); 
    } 
} 
String rawdata = new String(dataResponseSB); // dataResponseSB.toString(); also not work 
if (DataFactory.DEBUG_MODE) { 
    // data here are lost 
    Log.i("===LoadDataActivity","rawdata: "+rawdata); 
} 

( - )我收到的BufferedReader .readLine一個巨大的數據( )

( - )我使用日誌檢查和確保我行約每行8000緩衝區大小爲5,我非常確信我有正確接收的所有數據

(1)我追加每行的StringBuilder這裏

( - )我附上所有的行之後的StringBuilder

(2)我嘗試將其轉換回字符串

( - )現在,問題是,當我檢查到新的字符串在這裏,數據只有8192(它應該包含至少30,000或更多)

問題是什麼?我不知道它失去了當它追加到StringBuilder的(1)或它失去了當其轉換回字符串(2)


我補充一點,我曾嘗試以下這裏的代碼,,我都一直UTF8並沒有UTF8

  HttpParams params = new BasicHttpParams(); 
      HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
      //params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION,); 
      params.setParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 128 * 1024); 
      HttpClient client = new DefaultHttpClient(params); 


     // HttpClient client = new DefaultHttpClient(new BasicHttpParams()); 
      HttpPost httppost = new HttpPost(DataFactory.REQUEST_API_URL + "?id=" + DataFactory.USER_ID); 
      // Depends on your web service 

      HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); //Timeout Limit 
      HttpConnectionParams.setSocketBufferSize(client.getParams(), 128 * 1024); 
      HttpResponse response = client.execute(httppost); 
      //response.setParams(client.getParams().setParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 128 * 1024)); 

      //String rawdata = IOUtils.toString(response.getEntity().getContent(), "UTF-8"); 
      // String rawdata = EntityUtils.toString(response.getEntity()); 
      String rawdata = getResponseBody(response.getEntity()); 

      //Scanner s = new Scanner(response.getEntity().getContent()).useDelimiter("\\A"); 
      //String rawdata = s.hasNext() ? s.next() : ""; 


      /* 

      //BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
      // =================== 

      BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()), 128 * 1024); 
      StringBuilder dataResponseSB = new StringBuilder(); 
      String line ; 
      while ((line = reader.readLine()) != null) { 
       dataResponseSB.append(line); 
       if (DataFactory.DEBUG_MODE) { 
        Log.i("===LoadDataActivity","line: "+line); 
       } 
      } 
      dataResponseSB.trimToSize(); 
      String rawdata = new String(dataResponseSB); 

      /* 
      InputStreamReader reader = new InputStreamReader(response.getEntity().getContent()); 
      StringBuffer sb = new StringBuffer(); 
      int c; 
      while ((c = reader.read()) != -1) { 
       sb.append((char)c); 
       if (DataFactory.DEBUG_MODE) { 
        //Log.i("===LoadDataActivity","line: "+line); 
       } 
      } 
      */ 
+0

使用'字符串json = EntityUtils.toString(response.getEntity())' – Raghunandan

+1

您是否試圖插入print/log語句來測試您的猜測? – awksp

+0

@Raghunandan已經嘗試EntityUtils.toString和IOUtils.toString –

回答

3

我p萊蒂確信這就是問題所在:

Log.i("===LoadDataActivity","rawdata: "+rawdata); 

你假設日誌條目可以包括所有的數據 - 我相信每個日誌條目限制爲8192個字符。

我建議你記錄日誌rawdata.length(),你會發現它實際上得到了所有的數據 - 只是記錄它失敗了。

+0

真的很感謝,這是我的代碼的實際問題, 而不是這個,我發現我得到的長度增加了1(有些事情石灰40,000 + 1),不知道它是什麼錯誤 –

1

試試這個,,

public String getResponseBody(final HttpEntity entity) throws IOException, ParseException { 

     if (entity == null) { 
      throw new IllegalArgumentException("HTTP entity may not be null"); 
     } 

     InputStream instream = entity.getContent(); 

     if (instream == null) { 
      return ""; 
     } 

     if (entity.getContentLength() > Integer.MAX_VALUE) { 
      throw new IllegalArgumentException(

        "HTTP entity too large to be buffered in memory"); 
     } 

     StringBuilder buffer = new StringBuilder(); 

     BufferedReader reader = new BufferedReader(new InputStreamReader(instream, HTTP.UTF_8)); 

     String line = null; 
     try { 
      while ((line = reader.readLine()) != null) { 
       buffer.append(line); 
      } 

     } finally { 
      instream.close(); 
      reader.close(); 
     } 
     System.out.println("GEN END : " + Calendar.getInstance().getTimeInMillis()); 
     return buffer.toString(); 

    } 
+0

我複製/粘貼你的代碼並在其中使用 結果仍然只顯示8192 謝謝, –

+0

對不起,您的代碼也正確,因爲我的蠢 –

1
// Try this way,hope this will help you to solve your problem... 

StringBuilder buffer = new StringBuilder(); 

BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), HTTP.UTF_8)); 

String line = null; 
try { 
    while ((line = reader.readLine()) != null) { 
      buffer.append(line); 
    } 

} finally { 
    instream.close(); 
    reader.close(); 
} 
System.out.println("Buffer : " + buffer.toString()); 
+0

我複製/粘貼您的代碼並在其中使用,結果仍然只顯示8192謝謝 –

+0

對不起,您的代碼也是正確的,這是因爲我的愚蠢 –