El post que buscas se encuentra eliminado, pero este también te puede interesar

Java para programadores en C++ IV - Leer desde la consola

Anuncios

Java para programadores en C++ IV - Leer desde la consola

Java para programadores en C++


<< Volver al índice >>

Parte IV: Leer datos desde la consola.



La API de Java

En C++ tenemos disponible la biblioteca estándar, una colección de algoritmos y estructuras de datos, en forma de clases, estructuras, primitivas constantes y funciones declaradas en el espacio de nombres std, que podemos incluir en nuestros programas sin realizar ninguna instalación adicional. Este cuerpo lo componen principalmente la biblioteca estándar de C, heredada de aquel lenguaje, los elementos propios de la biblioteca estándar de C++, y la Standard Template Library (STL).

De la misma forma, en Java existe la "Librería de clases de Java" o "Java Application Programming Interface (Java API)" constituída por clases predefinidas agrupadas en paquetes. Desde el punto de vista de Java un "paquete" es el nombre de un conjunto de clases relacionadas, y desde el punto de vista del administrador de archivos de nuestra PC es una carpeta o directorio que contiene los archivos de código fuente de las clases que componen el paquete.

En C++ cuando queremos utilizar código externo a nuestro archivo de código fuente, utilizamos la directiva include. De la misma forma, en Java se va a utilizar la palabra clave import para indicar los módulos que se importan. Lo que sigue a la palabra import es la "dirección en forma de paquete" de lo que se vaya a importar. Lo que se puede importar es: un paquete, una clase o un método static (esto último sería como importar una función). La sintaxis es:
import nombrePaquete.NombreClase.nombreMetodoStatic;
Básicamente los puntos representan que el elemento de la derecha del mismo es un submiembro del elemento de la izquierda. El significado de "miembro" en este caso puede ser paquete, clase o método. Lo que se importa es el elemento final de la derecha, por lo que si lo que se quiere es importar una clase, la sintaxis será
import nombrePaquete.NombreClase;

<< Nota sobre situaciones de error >>
En el estándar de C++ estamos acostumbrados a que cuando las funciones o métodos no pueden realizar con éxito su operación, retornen un valor identificatorio como 0 o NULL. En Java en cambio todo el control de errores se maneja mediante el mecanismo de excepciones (throw...catch). Las excepciones, por cierto, tienen la misma sintaxis y funcionamiento que en C++, lo único que es propio de Java son las clases preestablecidas de excepciones que se utilizan en la API.

La documentación de la API de Java, donde van a encontrar todos los detalles de sus paquetes y clases, puede consultarse en: http://docs.oracle.com/javase/7/docs/api/

java

Lectura de datos por consola

Como dice en el tercer post de la serie, la clase System -definida en el paquete java.lang de la API de Java- tiene 3 objetos miembros static llamados in, out y err que corresponden a lo que en C++ son cin, cout y cerr respectivamente. En dicho post utilizamos los métodos de out para mostrar datos en la consola, ahora utilizaremos a in para leer datos ingresados en la misma.

A diferencia de out y err, in no tiene métodos para leer directamente tipos de datos desde la entrada -siendo que siguiendo el patrón de los otros dos que tienen métodos análogos a las funciones print de C, debería tenér métodos semejantes a las funciones scan. Revisando la documentación de la clase InputStream (de la que instancia in) podemos ver que sus métodos sirven para leer valores en bytes, cosa bastante tediosa.

Para realizar la tarea de forma más práctica tenemos a la clase Scanner -declarada en el paquete java.util-. Lo que hace Scanner es reconocer texto de una fuente (pasada como argumento a su constructor), dividirlo en tokens (el criterio de división por default el caracter de espacio) y reconocer los tipos de datos correspondientes a cada segmento resultante.
Entonces, para leer datos de la consola, vamos a "envolver" al objeto de entrada in en la clase Scanner, pasándolo como argumento a su constructor cuando instanciemos un objeto de dicha clase.

Lo primero a hacer es entonces declarar un objeto de tipo Scanner. Recordar: el import, utilizar System.in como argumento del constructor y el hecho de que todo objeto que no pertenezca a un tipo de dato primitivo es un puntero.
import java.util.Scanner;

public class PruebaEntrada {

    public static void main( String[] args ) {
        
        Scanner entrada = new Scanner( System.in );
        
    }
}

De esta forma obtenemos nuestro objeto entrada que vamos a utilizar de manera similar a cin de C++.

Como dijimos antes, Scanner separa la entrada en tokens y reconoce el tipo de cada segmento. Para leer un determinado tipo de entrada (como la función scanf() de C que lee diferentes tipos) se utilizan los métodos next ("siguiente" en inglés) de Scanner. A continuación se listan algunos de los que vamos a utilizar:
boolean nextBoolean( )
double nextDouble( )
float nextFloat( )
int nextInt( )
long nextLong( )
short nextShort( )

String nextLine( )
String next( )

Los primeros funcionan como se intuyen, devolviendo el primer valor del tipo de dato encontrado en la entrada. Sobre los últimos dos: nextLine() retorna una cadena con la entrada completa y next() retorna el primer token de la entrada. (Para la lista completa y detallada de los métodos de la clase así como también de las excepciones que tira, consultar su documentación: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html ).

Integrando los métodos en el código anterior hacemos andar nuestro Scanner
import java.util.Scanner;

public class PruebaEntrada {

    public static void main(String[] args) {
        
        Scanner entrada = new Scanner( System.in );
        double miDouble;
        float miFloat;
        int miInt;
        short miShort;
        long miLong;
        String miCadena;
        
        System.out.print( "Ingrese una cadena de texto: " );
        
        miDouble = entrada.nextDouble();
        miFloat = entrada.nextFloat();
        miInt = entrada.nextInt();
        miShort = entrada.nextShort();
        miLong = entrada.nextLong();
        miCadena = entrada.nextLine();
        
        System.out.println( "\nTokens separados en tipos y leidos: \n" );
        System.out.println( miDouble );
        System.out.println( miFloat );
        System.out.println( miInt );
        System.out.println( miShort );
        System.out.println( miLong );
        System.out.println( miCadena );
        
        System.out.println( "\nA continuacion se demuestra la separacion en tokens: \n" );
        System.out.print( "Ingrese una cadena de texto: " );
        while ( entrada.hasNext() ) {
            
            miCadena = entrada.next();
            System.out.println( miCadena );
            
        }
        
        entrada.close();
        
    }
}

Consola:
Ingrese una cadena de texto: 1,4 12,5 1356 13 948376 Hola mundo!

Tokens separados en tipos y leidos:

1.4
12.5
1356
13
948376
Hola mundo!

A continuacion se demuestra la separacion en tokens:

Ingrese una cadena de texto: Java para programadores en C++ parte 4
Java
para
programadores
en
C++
parte
4

Como a los flujos en C++, hay que cerrar el objeto Scanner cuando se lo termina de usar con su método close() . El método hasNext() retorna true si el objeto Scanner todavía tiene tokens almacenados en la entrada.
Las variables pueden mostrarse directamente con println() sin necesidad de usar printf() porque en Java todas las clases tienen un método toString() que retorna su valor en formato de texto, y en Java 7 los tipos primitivos son "envueltos" o convertidos de forma automática a clases mas robustas que representan a esos tipos (y al ser clases tienen el método toString() ). En otro post hablaré sobre estas clases de "envoltura".
En el ejemplo funcionó todo porque el orden de las llamadas a los métodos next coincidía con la entrada que puse, pero de lo contrario los métodos lanzan las excepciones correspondientes detalladas en la documentación de la clase. En otro post hablaré más en detalles sobre las excepciones.

Programacion

<< Volver al índice >>

Anuncios

3 comentarios - Java para programadores en C++ IV - Leer desde la consola

@Supertxuz +1
gracias!!! justo buscaba esto
boolean nextBoolean( )
double nextDouble( )
float nextFloat( )
int nextInt( )
long nextLong( )
short nextShort( )
String nextLine( )
String next( )
@elwear +1
Me alegro que te sirva . Fijate que abajo de la lista está el link a la documentación con el resto de los métodos por si necesitás otros.
@Giovvanizxz99
u-u LOL, mejor me quedo con C++ y python...
@elwear
Nah xD implementar estas cosas es igual de largo que en C++ con la diferencia de dos líneas que son la declaración del Scanner y el close() del mismo. El post es un poco largo para lograr comprensión.
@overfile +1
Muy buen post!! Muy completo
@elwear
Gracias!