30 marzo 2010

Leer entrada estándar (STDIN) en Java

Por motivos académicos, tengo que aprender a programar en Java; así que, tras haber aprendido C/C++ y al ser Java un lenguaje mucho más orientado a objetos que C++, quería practicar un poquito haciendo la traducción de algunos programas que he escrito en C++ a Java. Para ello necesito leer datos de la entrada estándar; pero tras buscar referencias, tanto en la documentación de Java como en diferentes blogs y paginas, no he conseguido encontrar una manera más o menos sencilla de hacerlo.

De todas maneras, tras leer un poco más a fondo algunas referencias y la documentación, he conseguido hacerlo de una manera algo más sencilla, imitando el comportamiento del while(cin >> var) de C++:

C++ Java
#include <iostream>
using namespace std;

int main(int argc, char **argv) {
  int n;
  while (cin >> n) {
    /* Código */
  }
}
import java.util.Scanner;

class main {
  static public void main(String[] args) {

    Scanner scanf = new Scanner(System.in);

    while (scanf.hasNextInt()) {
      int n = scanf.nextInt();
      /* Código */
    }
  }
}

Aquí tenéis la documentación del elemento Scanner.

Espero que este post os haya servido de ayuda.

Actualización 31/03/2010: Por desgracia, la solución supuestamente sencilla no sirve para leer char; para ello tenéis que hacer esto:

try { char c = (char) System.in.read(); }
catch (Exception e) {}

Si alguien conoce otra manera más sencilla y menos chapucera que lo que he escrito en este post, que lo comente.

Actualización 2: Si los char van a estar separados por espacios o saltos de línea, puedes hacer una de estas dos:

// scanf.next() devuelve un String
char c = scanf.next().charAt(0);
char c = scanf.next().toCharArray()[0]; // Ambas son equivalentes

Un saludo,
Morpheus