java - 将文件读入 CharBuffer,然后 StringBuilder 或 StringBuffer 似乎遗漏了文件的某些部分。为什么?

标签 java

下面的代码似乎只在 StringBuilder 中写入了文件的一小部分 - 为什么?

    Reader rdr = new BufferedReader(new InputStreamReader(new FileInputStream(...)));
    StringBuilder buf = new StringBuilder();
    CharBuffer cbuff = CharBuffer.allocate(1024);
    while(rdr.read(cbuff) != -1){
        buf.append(cbuff);
        cbuff.clear();
    }
    rdr.close();

一些更多信息:该文件比 CharBuffer 大,而且我可以从调试器中看到 charbuffer 确实已按预期填充。唯一进入 StringBuilder 的部分似乎来自文件中间的某个位置。我使用的是openJDK7。 我想知道为什么它会表现出这样的行为以及如何解决这个问题。

最佳答案

正如 Peter Lawrey 提到的,您需要在读取和写入之间调用 cbuff.flip()。看来追加将从缓冲区的位置读取,如果我们不调用cbuff.flip(),则位于末尾。中间某处的一部分仍然被写入的原因是因为最终缓冲区不会被完全填满,因此一些“旧”字节仍然会位于缓冲区中的位置和缓冲区末尾之间。

谜团解开了:-)

关于java - 将文件读入 CharBuffer,然后 StringBuilder 或 StringBuffer 似乎遗漏了文件的某些部分。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13154468/

相关文章:

java - 迷宫递归 - 少数输入出错(可能是逻辑错误)

java - 在 Spring Boot JPA 中插入数据并获取 ID

java - 使用ScalaCheck生成没有构造函数参数的对象

java - 将相对路径转换为绝对路径在 JSoup 中不起作用

java - tomcat的JNI配置

Java - ByteBuffer.remaining() 问题

java - 如何在链表中制作shuffle方法

java - 使用 Hector 客户端从 Cassandra 检索多列值

Java 中的 Linux 打印

java - 如何从firebase获取注册id以发送通知