为什么最后一次读取在使用BufferedReader和CharBuffer时附加了额外的字符?

时间:2018-06-07 07:48:22

标签: java

当我运行以下代码时,输​​出为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());
  }

4 个答案:

答案 0 :(得分:3)

在第三步之后,您的角色缓冲区dest包含uvwxyz1234

当您读取剩余的567890时,将覆盖缓冲区的前六个字符。这导致5678901234

答案 1 :(得分:2)

"为什么"已经回答了,现在只需更改Buffer.rewindBuffer.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来自您之前的阅读。