scanner read practice hackerrank from and java stdin

read - stdout java



¿Por qué no podemos leer un carácter a la vez desde System.in? (3)

¿Cuál es la razón subyacente de esto?

La mayoría de los terminales tienen búferes de línea por defecto, Java no recibe entrada hasta una nueva línea.

¿Es una limitación de Java?

Es posible que algunos terminales antiguos solo tengan entrada de línea tamponada; aunque debería ser posible deshabilitar el almacenamiento en búfer en la mayoría de los terminales modernos.

¿Este comportamiento depende del sistema (estoy en Ubuntu)? ¿Cómo funciona en Mac? Windows?

Sí.

¿Depende del terminal específico en el que ejecuto la aplicación? (Para mí se comporta así en Eclipse y en gnome-terminal)

Sí.

¿Hay una solución?

Hay hacks específicos de plataforma. curse en Linux y plataformas similares a Unix, y getch () en Windows. No tengo conocimiento de ninguna manera multiplataforma.

relacionado : Por qué "Presionar cualquier tecla para continuar" es una mala idea:

El siguiente programa imprime cada carácter escrito en estándar, pero solo después de que se haya escrito una nueva línea (¡al menos en mi sistema!).

public class Test { public static void main(String[] args) throws java.io.IOException { int c; while ((c = System.in.read()) != -1) System.out.print((char) c); } }

Esto evita que las personas escriban cosas como "Presiona cualquier tecla para continuar" y fuerza algo como "Presiona Enter para continuar".

  • ¿Cuál es la razón subyacente de esto?
  • ¿Es una limitación de Java?
  • ¿Este comportamiento depende del sistema (estoy en Ubuntu)? ¿Cómo funciona en Mac? Windows?
  • ¿Depende del terminal específico en el que ejecuto la aplicación? (Para mí se comporta así en Eclipse y en gnome-terminal)
  • ¿Hay una solución?

Estoy en Ubuntu

¿Hay una solución?

Runtime.getRuntime().exec("stty -icanon min 1").waitFor();

Y después de eso, todas las lecturas de System.in en el mismo proceso leerán 1 carácter sin esperar a EOL.


¿Ver mi respuesta en Función equivalente a "_getch ()" de C en Java?

public static void getCh() { final JFrame frame = new JFrame(); synchronized (frame) { frame.setUndecorated(true); frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME); frame.addKeyListener(new KeyListener() { public void keyPressed(KeyEvent e) { synchronized (frame) { frame.setVisible(false); frame.dispose(); frame.notify(); } } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } }); frame.setVisible(true); try { frame.wait(); } catch (InterruptedException e1) { } }

}