документы говорят:
public int read() throws IOException
Возвращает: символ читается как целое число в диапазоне от 0 до 65535 (0x00-0xffff) или -1, если достигнут конец потока.
Так в случаеReader следует проверять на EOF, например
// Reader r = ...;
int c;
while (-1 != (c=r.read()) {
// use c
}
. В случае BufferedReader и readLine () это может быть
String s;
while (null != (s=br.readLine())) {
// use s
}
, потому что readLine () возвращает ноль на EOF.