Java 将文件读入CharBuffer后,StringBuilder或StringBuffer似乎遗漏了文件的某些部分。为什么?
下面的代码似乎只在StringBuilder中编写了文件的一小部分-为什么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
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的一部分”吸引眼球,但完全是错误的。所以你认为它们都有致命的缺陷,仍然需要修复?所有这些都需要重写,而不是建议新手看看他们做了什么?这是三年后需要的吗?