JAVA IO:使用 BufferedReader 读取流时出现问题



我尝试使用缓冲读取器读取 JSON 响应,如下所示。我正在使用Apache Commons Http客户端。响应以单行 JSON 形式出现,字符数约为 1060000,大小约为 1 MB。我面临的问题是只有一部分流被阅读器读取,而其他部分丢失。如何在不丢失任何数据的情况下读取完整的 JSON。?这是否与缓冲读取器的"字符缓冲区大小"或流中的字符数有关?

InputStream stream = method.getResponseBodyAsStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
StringBuilder builder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
    builder.append(line);
}

尝试使用json解析器。

    import org.codehaus.jackson.*;
    JsonFactory fac = new JsonFactory();
    JsonParser parser =  fac .createJsonParser(stream);

如果你只想将完整的流复制到StringBuilder中,你应该使用 InputStreamReaderchar 数组缓冲区。

InputStream stream = method.getResponseBodyAsStream();
InputStreamReader reader = new InputStreamReader(stream, "UTF-8");
StringBuilder builder = new StringBuilder();
char[] buffer = new char[4096];
int read;
while ((read = reader.read(buffer)) != -1) {
    builder.append(buffer, 0, read);
}
最后,

我能够使用 Apache Commons 库中的 IOUtils 来解决。这是代码。

BoundedInputStream boundedInputStream= new BoundedInputStream(stream);
BufferedReader reader = new BufferedReader(new InputStreamReader(boundedInputStream,"UTF-8"));
StringBuilder builder= new StringBuilder();
StringBuilderWriter writer = new StringBuilderWriter(builder);
IOUtils.copy(reader, writer);

虽然已经有一段时间了,但可能对某人有所帮助。

这是原始来源,使用 Java 读取文件或流的最可靠方法(防止 DoS 攻击(

最新更新