Android HttpUrlConnection InputStream读取错误(JSONException:未终止数组)

时间:2016-01-11 20:23:23

标签: java android inputstream httpurlconnection

我正在使用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

1 个答案:

答案 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应该没问题,不应再包含任何垃圾数据了。