【问题标题】:BufferedReader java not reaching end of fileBufferedReader java没有到达文件末尾
【发布时间】:2013-01-02 21:32:51
【问题描述】:

目前我正在尝试从内容长度为 37743 的响应中读取一个不那么短的流。我正在使用 read(char[] buffer, int offset, int length),但在比较时并未读取所有流它到我正在阅读的原始 json 文件。我试图检查这是否是一个常见问题,但我找不到任何可能导致问题的原因:

  • 字符串生成器的最大长度?
  • char[] 的最大长度?
  • 缓冲区长度? (目前为 8192)
  • 条件不正确? (跟随sn-p)
while ((reader.read(buffer, 0, buffer.length)) != -1)
     sb.append(String.valueOf(buffer)); //sb is the String builder

注意当缓冲区长度改变时,结果会再次改变,例如改成1024后,与8192缓冲区得到的结果相同,加上另一段与原始json字符串不一致的文本。

【问题讨论】:

  • 不要做 String.valueOf(buffer) - StringBuilder 有一个 append(char[]) 方法
  • 你的BufferedReader是从哪里得到的?您是否正确考虑编码?

标签: java file buffer bufferedreader


【解决方案1】:

您永远不应忽略Reader.read() 的结果。如果到达流的末尾,则返回 -1。如果不是,则返回已读取的字符数。假设它准确读取您要求它读取的字符数是错误的。

改成

while ((read = reader.read(buffer, 0, buffer.length)) != -1) {
    sb.append(buffer, 0, read);
}

【讨论】:

  • 或者更好的是,使用 Jakarta Commons 中经过充分测试的方法之一IOUtils
  • 非常感谢。这非常有效。但它看起来你的 while 条件和我的一样(除了给'read'赋值)。这是否意味着问题出在 sb.append 方法的使用上?
  • 是的。你的追加缓冲区的全部内容,而我的只追加实际读取的字符:从 0 到 read
【解决方案2】:

您应该使用以下方式编写 sb 对象:

public StringBuilder append(char[] str,
                        int offset,
                        int len)

偏移量为 0,len 作为 reader.read 的返回值

int len = 0;

while ((len = reader.read(buffer,0,buffer.length))!=-1) {
    sb.append(buffer,0,len);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 2013-08-02
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    相关资源
    最近更新 更多