sábado, 29 de septiembre de 2012

Leer Entradas desde el Teclado

Leer Entradas desde el Teclado en Java



ÍNDICE

Objetivos Generales
- Introducción
- Leer datos ingresados desde el teclado en java 
       - Clase Scanner (java.util.scanner)
         -  Clase (java.io)
- Enlaces para Videos
Conclusión

Objetivos Generales



  • Comprender como se leen entradas desde el teclado en java.
  • Conocer algunas de las clases que java puede utilizar.
  • Aprender a emplear programas que utilicen clases que permitan leer entradas desde el teclado.

INTRODUCCIÓN


Cuando decimos Entrada nos referimos a ingresar datos, es posible leer los datos que se introducen por medio del teclado en un programa realizado en el lenguaje de programación Java, como Java es un programa orientado a objetos funcionará por medio de clases.

Así que antes de comenzar con el tutorial para aprender a leer la entrada desde el teclado en Java en importante saber que es una clase; diremos que una clase es un molde del que luego se pueden crear múltiples objetos con características similares y que posee una plantilla (molde), que define atributos (variables) y métodos (funciones). 

La estructura de una clase es:

class [nombre de la clase] { 
[atributos o variables de la clase]
[métodos o funciones de la clase]
[main]
{

Ya sabido esto podemos pasar al tema principal.


Leer la Entrada desde el Teclado en Java


Clase Scanner (java.util.scanner)


Una de las maneras más sencillas es por medio de la clase Scanner (java.util.scanner), como dato extra cabe mencionar que disponemos de la clase Scanner desde Java 1.5

Programa:

// para leer de teclado necesitamos la clase Scanner
import java.util.Scanner;
    
public class Ejemplo {
    
    public static void main(String[] args) {
        
     // sc se usará para leer los datos
     Scanner sc = new Scanner(System.in);
     
     // preguntar la edad
     System.out.print("¿Cuántos años tienes?  ");
 
     // leer un entero
     int edad = sc.nextInt();
     
     System.out.println("...pues aparentas "+(edad-3));
  } // main   
}

La salida de datos de este programa quedaría así:
¿Cuántos años tienes? 22 
Pues aparentas 19

Ahora analicemos el ejemplo:
       
import java.util.Scanner; Para leer desde teclado se debe utilizar un objeto de la clase Scanner. Esta clase no es de las incluidas de forma automática y por eso debe incluirse mediante la palabra clave import.    Si la clase está definida en otro paquete se escribe el nombre "cualificado", precedido por el nombre del paquete. En este caso la clase Scanner es parte del paquete útil que es a su vez parte de la clase java. Si se desean incluir varias clases se incluirán varias sentencias import:
     import java.util.Scanner;
     import java.util.Vector;
Si se quieren incluir varias (o todas) clases del mismo paquete se puede usar el simbolo *:

     import java.util.*; // importa Scanner, Vector y muchas más
Para ver qué clases contiene cada paquete conviene consultar la ayuda de Java.  
Scanner sc = new Scanner(System.in); Esta instrucción declara y comienza un objeto sc de tipo Scanner. El parámetro System.in indica de dónde se leerá, en este caso de la entrada estándar. 
int edad = sc.nextInt(); La llamada al método nextInt(); devuelve el siguiente entero que se puede leer del objeto de tipo Scanner. Además de enteros se pueden leer valores de otros tipos. Para leer una línea completa se usará el método nextLine(); que devuelve un valor de tipo String:
import java.util.Scanner;
    
public class Principal {
    
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        System.out.print("¿Cómo te llamas? ");
        String nombre = sc.nextLine(); // leer una cadena de caracteres
        System.out.println("Es un placer conocerte "+nombre);
  } // main   
}
Si deseas ver otro ejemplo has click AQUÍ 
Si se te es complicado ver la imagen puedes utilizar el zoom in. 


Clase Java.io


Esta clase esta diseñada para interrogar al usuario sobre determinado archivo, leer su contenido y finalmente indica al usuario el número de renglones que contiene, consta únicamente de su método principal (main) y un bloque try/catch/finally.

Programa:

import java.io.*;

public class Calculo {

    public static void main(String[] args) throws IOException  {

                String s;
                int lineas = 1;

                try {
                    System.out.print("Que archivo desea analizar ? ");
                    BufferedReader stdin = new BufferedReader(
                             new InputStreamReader(System.in));
                    String archivo = stdin.readLine();
                    BufferedReader sarchivo = new BufferedReader(
                             new FileReader(archivo));
                    while (( s = sarchivo.readLine()) != null)
                               lineas++;
                    System.out.println("El archivo " + archivo +
                             " contiene " + lineas + " renglones de Codigo.");

        } catch (IOException exc) {

                    System.err.println(exc);
                    System.out.println("Asegurese de haber proporcionado " +
                               " la extension del archivo (\".java\")");

                } finally {

                    System.out.println("");
                    System.out.println("Es la mejor manera de aprender Streams, practicando!");
                }
                   
    }
}


Ahora analicemos el ejemplo:
       

De inicio son definidos dos campos para utilizarse dentro del                       método principal (main).Posteriormente se define el bloque try/catch/finally con las siguientes características:
try
Se despliega una pregunta al usuario para que proporcione el nombre del archivo a leer.Es definida una Clase del tipo BufferedReader la cual permite archivar datos temporales en memoria ("Buffer")
El argumento que recibe al ser generada la Clase anterior es otra Clase llamada InputStreamReader, la cual permite leer datos de un "Stream", en este caso siendo System.in que representa el shell de ejecución.
Se extrae el nombre del archivo a través del método readLine() y es asignado a una referencia deString.
Es generada una nueva instancia de la Clase BufferedReader a la cual será asignada el archivo en cuestión.
El argumento que recibe al ser generada la Clase anterior es otra Clase llamada FileReader, la cual contiene los mecanismos necesarios para leer un Archivo, y en este caso recibiendo el nombre del archivo.
Se entra en un ciclo while el cual permanecerá activo hasta que el resultado del método readLine()sobre la referencia definida anteriormente equivalga a null. NOTA: El método readLine retorna un resultado null ya que el archivo no contenga lineas.
Dentro de cada iteración de ciclo se incrementa la variable (primitivo) lineas la cual representa el número de lineas en el archivo.
Finalmente se envía a pantalla el resultado obtenido del ciclo.
catch
Dentro de está sección del Bloque se intenta atrapar un error ("Exception") del tipo IOException, este tipo de error es generado al no poderse iniciar lectura/escritura en un programa.
En este programa el error sería generado al intentarse leer un archivo inexistente proporcionado por el usuario, en caso de generarse este error, se envía a pantalla una sugerencia así como el error completo. 
finally
Esta sección del Bloque describe instrucciones que siempre deben ser ejecutadas independientemente de ser generado un error ("Exception") o no.Se imprime a pantalla un mensaje cada vez que sea ejecutado el programa, ocurra o no ocurra un error ("Exception")


Si deseas ver otro ejemplo has click AQUÍ 
Si se te es complicado ver la imagen puedes utilizar el zoom in. 


Videos


      Para comprender mejor la clase  java.util.scanner visita el siguiente enlace:



      Para comprender mejor la clase java.io visita los siguientes enlaces:
     

      

Conclusión

Entre las clases de java.io y java.util.scanner hay mucha semejanza, ya que ambos requieren la entrada de datos por el teclado. La diferencia más notoria estaría en sus funciones y el contenido de estas.

Una ventaja que es muy notoria a favor de java.util.scanner es que el código que escribamos será más breve que el que escribiremos en java.io, esto nos ahorrara mucho tiempo.

Excluyendo eso ambas clases son una buena opción para aquellas personas que empiezan en el mundo de la programación, ya que son muy sencillas de manejar, lo que permitirá al usuario tener una comprensión veloz sobre como leer entradas desde el teclado.

"Primero soluciona el problema. Luego escribe el código" Jhon Jhonson