Java StringBuilder在转换为字符串时丢失数据
这里有什么问题 当我试图从StringBuilder获取字符串时出现问题Java StringBuilder在转换为字符串时丢失数据,java,android,string,stringbuilder,Java,Android,String,Stringbuilder,这里有什么问题 当我试图从StringBuilder获取字符串时出现问题 BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()), 128 * 1024); StringBuilder dataResponseSB = new StringBuilder(); String line ; while ((line = reader.readLine())
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()接收到大量数据
()
(1) 我在这里将每一行附加到StringBuilder中
(-)在我将所有行附加到StringBuilder之后
(2) 我尝试将其转换回字符串
()
有什么问题?我不确定它是在附加到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);
}
}
*/
试试这个,
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();
}
我很确定这就是问题所在:
Log.i("===LoadDataActivity","rawdata: "+rawdata);
您假设一个日志条目可以包含您的所有数据-我相信每个日志条目都限制为8192个字符
我建议您记录
rawdata.length()
,您将看到它实际上包含了所有的数据,只是记录失败了。使用String json=EntityUtils.toString(response.getEntity())
您是否尝试插入打印/日志语句来测试您的猜测?@Raghunandan尝试了EntityUtils.toString和IOUtils。toString@Raghunandan很抱歉,您的代码也是正确的,因为我的stupidI复制/粘贴了您的代码并在其中使用结果仍然显示只有8192谢谢,很抱歉,您的代码也是正确的,因为我愚蠢的复制/粘贴你的代码并在其中使用结果仍然显示只有8192谢谢我很抱歉,你的代码也是正确的,因为我愚蠢的感谢,这是我代码的实际问题,而不是这个,我发现我得到的beffered的长度增加了1(有些东西是40000+1),不知道这样做的最佳实践是什么:Log.i(“==LoadDataActivity”,“rawdata:[“+rawdata+”])代码>(注意数据周围的括号)。这样,很明显,被截断的不是原始数据,StringBuilder将是“无辜的”。
Log.i("===LoadDataActivity","rawdata: "+rawdata);