当我运行以下代码时,输出为abcdefghijklmnopqrstuvwxyz12345678901234
。
为什么位1234
附加到最终字符串,即使最后一次读取只包含6个字符,即567890
?
行(reader.read(dest)
如何工作以及最后一位来自何处?
public static void main(String[] args)
{
CharBuffer dest = CharBuffer.allocate(10);
StringBuffer content = new StringBuffer();
try {
BufferedReader reader = new BufferedReader(new StringReader("abcdefghijklmnopqrstuvwxyz1234567890"));
while (reader.read(dest) > 0) {
dest.rewind();
content.append(dest.toString());
}
} catch (IOException e) {
System.out.println(e);
}
System.out.println(content.toString());
}
答案 0 :(得分:3)
在第三步之后,您的角色缓冲区dest
包含uvwxyz1234
。
当您读取剩余的567890
时,将覆盖缓冲区的前六个字符。这导致5678901234
。
答案 1 :(得分:2)
"为什么"已经回答了,现在只需更改Buffer.rewind
到Buffer.flip
翻转此缓冲区。限制设置为当前位置,然后位置设置为零。如果定义了标记,则将其丢弃。
while (reader.read(dest) >= 0) {
dest.flip();
content.append(dest.toString());
}
这与rewind
相同,但在此之前,它会将限制更改为当前位置。这样,当你只阅读最后6个字符时,限制将设置为6,而toString
只会给你一个6个字符的String
,而不是10个。
答案 2 :(得分:1)
尝试一下以了解@lexicore给出的答案。应该是自我解释的。
public static void main(String[] args) {
String[] inputs = { "abcd1234", "abcdefghijklmnopqrstuvwxyz12345678901234" };
int[] sizes = { 1, 2, 3, 4 };
read(sizes[2], inputs[0]);
}
public static void read(int size, String input) {
CharBuffer dest = CharBuffer.allocate(size);
StringBuffer content = new StringBuffer();
try {
BufferedReader reader = new BufferedReader(new StringReader(input));
while (reader.read(dest) > 0) {
dest.rewind();
System.out.println("Content:" + content);
content.append(dest.toString());
System.out.println("String read:" + dest.toString());
}
} catch (IOException e) {
System.out.println(e);
}
System.out.println(content.toString());
}
答案 3 :(得分:0)
字符串1234
来自您之前的阅读。