为什么 BufferedReader read() 会拾取额外的字符

Why is BufferedReader read() picking up extra character

我正在创建一个霍夫曼编码方法,该方法使用缓冲 reader 来读取文件,将新的 char 值添加到名为 'characters[128]' 的数组中,如果该 char 已经存在于 'characters[128]' 然后将 1 添加到该字符的 frequency/count (我将其存储在与字符相同的索引处的 charCount[128] 中)。我会附上我的代码,但是当我 运行 这个时,它会为最后一个字符打印出一个未知的 char () ,这意味着它比它应该的更晚一次停止 while 循环。你知道为什么吗?我该如何解决这个问题?

public Playground() {
    char c;
    int size = 0;
    char[] characters = new char[128];
    int[] charCount = new int[128];
    BufferedReader br = null;
    try {   
        br = new BufferedReader(new FileReader("input.txt"));
        while ((c = (char)br.read()) != -1) {
            for (int i = 0; i <= size; ++i) {
                if (size == 0) {
                    characters[i] = c;
                    charCount[i]++;
                    size++;
                    System.out.println("Letter/Count: " + characters[i] + "/" + charCount[i]);
                    break;
                }
                if (characters[i] == c) {
                    charCount[i]++;
                    break;
                } else if (i == size) {
                    characters[i] = c;
                    charCount[i]++;
                    size++;
                    System.out.println("Letter/Count:"+characters[i]+"/" + charCount[i]);
                    break;
                }
            }
        }
        br.close();
    } catch (IOException e){
        System.out.println("IOEXCEPTION: " + e);
    }
}
public static void main(String args[]) {
    System.out.println("Main Is Working");
    Playground p = new Playground();
    System.out.println("Constructor is not");
}

问题是您将 int 转换为 char,然后再次将其与 int -1 进行比较。做这样的事情:-

int i = -1;
while ((i = br.read()) != -1) {
     char c = (char)i;
     for (int i = 0; i <= size; ++i) {
        if (size == 0) {
            characters[i] = c;
            charCount[i]++;
            size++;
            System.out.println("Letter/Count: " + characters[i] + "/" + charCount[i]);
            break;
        }

        if (characters[i] == c) {
            charCount[i]++;
            break;
        } else if (i == size) {
            characters[i] = c;
            charCount[i]++;
            size++;
            System.out.println("Letter/Count: " + characters[i] + "/" + charCount[i]);
            break;
        }
    }
}