Метод ready(), нюансы использования

У меня есть небольшое затруднение с методом ready() и его использованием.

В частности вот 2 кода, 1 код рабочий, метод ready(), используется с FileReder и суть задачки, что я ищу в файле нужные буквы

public class Solution {
public static void main(String[] args) throws IOException {
    FileReader fileReader = new FileReader(args[0]);
    int count = 0;
    Pattern pattern = Pattern.compile("[a-zA-Z]");
    while (fileReader.ready()){
        String x = Character.toString((char) fileReader.read());
        Matcher matcher = pattern.matcher(x);
        if (matcher.find()){
            count++;
        }

    }
    System.out.print(count);
    fileReader.close();
}

}

Второй код не рабочий, я использую метод ready() с классом StringReader, но из цикла не выхожу, проблема именно с ready(), а не с телом while или еще чем, потому что через условие reader.read() )!= -1 все работает как надо. Код расшифровывает Шифр Цезаря. Так вот, почему в одном случае с классом FileReder метод закрывает цикл, когда заканчиваются байты для чтения, а с StringReader нет?

Пример не работающего кода

public class Solution {
public static void main(String[] args) throws IOException {
    StringReader reader = new StringReader("Khoor#Dpljr#&C,₷B'3");
    System.out.println(decode(reader, -3));  //Hello Amigo #@)₴?$0
}

public static String decode(StringReader reader, int key) throws IOException {
    StringBuilder str = new StringBuilder();
    if (reader != null){
        int ch1;
        while (reader.ready()){
            char ch = (char) reader.read();
            str.append((char) (ch + key));
        }
    }
    return str.toString();
}

}


Ответы (1 шт):

Автор решения: Sergey Zh.

Я залез в документацию этого StringReader, и надо сказать что метод ready() устроен очень странно:

    public boolean ready() throws IOException {
    synchronized (lock) {
        ensureOpen();
        return true;
    }
}

а теперь смотрим на ensureOpen();

    private void ensureOpen() throws IOException {
    if (str == null)
        throw new IOException("Stream closed");
}

То есть получается, что метод ready() всегда возвращает true.

→ Ссылка