Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将文件读入CharBuffer后,StringBuilder或StringBuffer似乎遗漏了文件的某些部分。为什么?_Java - Fatal编程技术网

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

Java 将文件读入CharBuffer后,StringBuilder或StringBuffer似乎遗漏了文件的某些部分。为什么?,java,Java,下面的代码似乎只在StringBuilder中编写了文件的一小部分-为什么 Reader rdr = new BufferedReader(new InputStreamReader(new FileInputStream(...))); StringBuilder buf = new StringBuilder(); CharBuffer cbuff = CharBuffer.allocate(1024); while(rdr.read(cbuff) != -1

下面的代码似乎只在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。
我想知道为什么它会显示这样的行为,以及如何解决这个问题。

自1.0以来,所有这些类都是JDK的一部分。我怀疑这些问题是否需要解决

您的代码与通常的习惯用法相比还有很长的路要走。这是作为一个学习练习,一个出错的练习吗?或者你真的想把这个应用程序

下面是我希望看到使用这些类的方式:

public static final String NEWLINE = System.getProperty("line.separator");

public String readContents(File f) throws IOException {
    StringBuilder builder = new StringBuilder(1024);
    BufferedReader br = null;
    try {
        br = new BufferedReader(new FileReader(f));
        String line;
        while ((line = br.readLine()) != null) {
            builder.append(line).append(NEWLINE);
        }
    } finally { 
        closeQuietly(br);
    }
    return builder.toString();
}

正如Peter Lawrey提到的,您需要在读写之间调用
cbuff.flip()
。如果我们不调用
cbuff.flip()
,则append似乎将从缓冲区的位置读取,该位置在末尾。中间的某个部分仍然被写入的原因是因为最后,缓冲区不会被完全填充,因此一些“旧”字节仍然位于缓冲器的位置和缓冲器的末端之间。
谜团已解:-)

我很惊讶这在不调用
cbuff.flip()的情况下还能工作在read()和append()之间你知道吗?我想你刚刚给出了答案。最后一个read()只填充缓冲区的一部分,然后追加将从末尾追加“old”字节。这就是它的工作原理吗?我想你是对的。我想避免这种情况,但结果更糟:-P。这仍然不能回答为什么这不起作用的问题。这会删除可能不需要的新行字符。因此,请将它们添加进来。我会的。我同意这个答案不能解释您的问题,但我不确定是否鼓励您使用您发布的代码。大多数Reader子系统都是在1.1、CharBuffers 1.4和StringBuilders 1.5中添加的。你所说的“从1.0开始,所有这些类都是JDK的一部分”吸引眼球,但完全是错误的。所以你认为它们都有致命的缺陷,仍然需要修复?所有这些都需要重写,而不是建议新手看看他们做了什么?这是三年后需要的吗?