无法从输入流中读取大型JSON数据

时间:2015-11-18 11:27:56

标签: java httpurlconnection

Java(TM) SE Runtime Environment (build 1.7.0_45-b18)

您好,

我正在使用httpUrlConnection从webservice中检索json字符串。然后我从连接中获取inputStream

jsonString = readJSONInputStream(mHttpUrlconnection.getInputStream());

然后我使用以下函数读取输入流以获取JSON。

private String readJSONInputStream(final InputStream inputStream) {
    log.log(Level.INFO, "readJSONInputStream()");

    Reader reader = null;

    try {
        final int SIZE = 16092;

        char[] buffer = new char[SIZE];
        int bytesRead = 0;
        int read = 0;

        reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), SIZE);
        bytesRead = reader.read(buffer);

        String jsonString = new String(buffer, 0, bytesRead);
        log.log(Level.INFO, "bytesRead: " + bytesRead + " [ " + jsonString + " ]");
        /* Success */
        return jsonString;
    }
    catch(IndexOutOfBoundsException ex) {
        log.log(Level.SEVERE, "UnsupportedEncodingexception: " + ex.getMessage());
    }
    catch(IOException ex) {
        log.log(Level.SEVERE, "IOException: " + ex.getMessage());
    }
    finally {
        /* close resources */
        try {
            reader.close();
            inputStream.close();
        }
        catch(IOException ex) {
            log.log(Level.SEVERE, "IOException: " + ex.getMessage());
        }
    }

    return null;
}

但是,如果json很小,说600 bytes则一切正常(因此上面的代码适用于较小的数据)。但是我有一些大约15000 bytes的JSON,因此我将最大大小设置为16092

然而,JSON只能读到大约6511并且只是切断了。

我不明白如果JSON很小就没问题了。但对于较大的JSON,它每次都会切断相同的大小。

我在这里做错了什么。我应该检查的任何事情。

非常感谢任何建议,

3 个答案:

答案 0 :(得分:3)

请尝试以下代码:

String readResponse(InputStream inputStream) throws IOException {
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
    String line = "";
    String result = "";
    while ((line = bufferedReader.readLine()) != null)
        result += line;

    inputStream.close();
    return result;
}

答案 1 :(得分:2)

很可能你的代码在这里被破坏了:

bytesRead = reader.read(buffer);

你应该循环阅读。我想你不会从流中读出所有的字符。

答案 2 :(得分:1)

您应该继续从缓冲区读取,直到bytesRead = -1。

我怀疑读者正在缓冲数据并且一次只返回一定数量的数据。

尝试循环,直到bytesRead == -1,每个循环将读取数据附加到结果字符串。