Recuerden que System.in denota la entrada estándar y tiene tipo InputStream. Como pueden revisar en la documentación de Java, la función read( ) devuelve el valor entero del siguiente byte, pero además avanza en el flujo, por lo que esta función combina el efecto tanto de examina( ) como de consume( ). Java garantiza usar el valor -1 para indicar el fin de la entrada, así que no existe EOF. Desafortunadamente, InputStream no tiene el equivalente de peek( ) de std::istream de C++, por lo que la implementación de EntradaEstandar se complica un poco en comparación con la tarea 4.
Les sugiero que dentro de EntradaEstandar guarden (como variable miembro o campo) un int ultimo que sea el valor del último byte que han leído. Desde luego, inicialícenlo en -1 para indicar que no han leído nada inicialmente. Dentro de examina( ) revisen cuánto vale ultimo: si vale -1 lean el siguiente byte de System.in, guárdenlo en ultimo y luego devuelvan el valor; si ultimo es distinto a -1, no lean nada adicional y simplemente devueltan ultimo. Por su parte, la función consume( ) debe asegurarse de haber leído algo primero, pero luego pueden poner a ultimo en -1 para lograr el efecto de descartar el valor del último byte leído y forzar la lectura la próxima vez que les pidan otro byte.
Los equivalentes de std::isspace y std::isdigit de C++ se llaman Character.isWhitespace y Character.isDigit en Java. Sin embargo, a éstos les deben pasar valores de tipo char y no existe la conversión implícita de int a char. Sin embargo, pueden hacer un moldeado así: Character.isDigit((char)ent.examina( )).