我正在使用HttpUrlConnection从Web获取一个非常大的JSON数组。我一次读取500字节的数据:
public String getJSON(String myurl) throws IOException {
URL url = new URL(myurl);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
String result = readIt(in, 500) ;
return result ;
//Log.d(TAG, result);
}
finally {
urlConnection.disconnect();
}
}
public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException {
StringBuilder result = new StringBuilder();
InputStreamReader reader = null;
reader = new InputStreamReader(stream, "UTF-8");
char[] buffer = new char[len];
while(reader.read(buffer) != -1)
{
System.out.println("!@#: " + new String(buffer)) ;
result.append(new String(buffer)) ;
buffer = new char[len];
}
System.out.println(result.length()) ;
return result.toString();
}
这适用于某些手机,但不适用于较新的手机。在较新的手机上,我意识到结果JSON字符串一旦到达字符2048就开始包含垃圾字符。
我的一些垃圾回收数据:
ST STUSUGINE,FL","2012050���������������������������������
完整的错误是: 错误:org.json.JSONException:{" COLUMNS"的字符40549处的未终止数组:[" IMAGELI
答案 0 :(得分:0)
您可能在字符串中附加了错误的缓冲区。您应该计算读取时获得的char数量,并将它们附加到字符串中,但不能再使用:
String str = new String(); // or use a StringBuilder if you prefer
char[] buffer = new char[len];
while ((count = reader.read(buffer, 0, len)) > 0)
{ str += new String(buffer, 0, count); }
每次都避免重新创建缓冲区!您为每个循环分配一个新的...重新使用缓冲区,因为您已在str。
中刷新它调试时要刻意:你不能在logcat中打印太长的字符串(如果太长则会被剪掉)。但你的str应该没问题,不应再包含任何垃圾数据了。