Lectura de datos y salida formateada en una aplicación Java de consola


Cuando nos estamos iniciando en el mundo de la programación Java es muy común construir aplicaciones Java de consola (programas que corren en una ventana terminal o en un prompt de MS-DOS) y nos vemos en la necesidad de ingresar de alguna manera datos a nuestro programa. Una alternativa es el paso de parámetros (la razón del porqué el método main recibe un arreglo de tipo String), pero si queremos cambiar un dato de ingreso necesitamos volver a ejecutar el programa. Otra solución es utilizar un código como este:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String str = “”;
while (str != null)
{

System.out.print(“ingreso > “);
str = in.readLine();

}

Pero resulta algo tedioso de memorizar.Tomando en cuenta lo anterior la gente de Sun ha creado una nueva clase, que permite con un par de líneas realizar la misma tarea. Veamos el siguiente ejemplo:

Scanner entrada = new Scanner(System.in);
System.out.print(“Ingrese un valor: “);
num = entrada.nextInt();

Utilizando la clase Scanner es posible leer los datos ingresados por el usuario desde teclado, para ello debemos utilizar el objeto de entrada por defecto(System.in). El método nextInt() toma lo digitado por el usuario y lo convierte en un número entero (existen varios métodos next… para cada tipo de dato primitivo de Java y para algunos tipos de datos compuestos, como cadena de caracteres).También para la salida de datos, con formato, existe un nuevo método printf. Éste método permite entre otras cosas:

  • Redondeo de los decimales de un número.
  • Alineación de números en columnas
  • Justificación izquierda y derecha
  • Representación de números en formato exponencial.
  • Mostrar fecha y hora en varios formatos.

El método printf recibe como parámetros el formato y los valores que presentará. Veamos un ejemplo:

System.out.printf(“%d%s\n”, num, ” es primo”);

%d se utiliza para números enteros, mientras %s para cadena de caracteres (String). Esta primera parte se conoce como el formato para mayores detalles vea aquí. Los otros 2 argumentos son los valores que se mostrarán el primero es una variable tipo int y el segundo un String. Pueden encontrar una mayor referencia en el libro Java How to program, sixt Edition de Dietel&Dietel.

El código completo lo pueden descargar desde aquí.

29 comentarios en “Lectura de datos y salida formateada en una aplicación Java de consola

  1. Hernando dijo:

    Hola,
    Yo estoy iniciando me en java y utilizo BufferedReader para ingresar datos por teclado con Jdeveloper pero por alguna razon que desconosco cuando dijito el valor y le doy enter este no ingresa al programa.
    me pueden ayudar?, algo en la configuracion talvez del software.
    Muchas gracias

  2. Hola Hermando,

    Nunca me gustó eso del BufferReader, no sé porque pero prefería utilizar parámetros y la nueva clase Scanner.

    Te propongo que depures tú programa, para eliminar cualquier tema de una mala implementación. Trata de probar el mismo código en un IDE diferente para así determinar si se trata de alguna configuración del JDeveloper o es algo con el código.

    Trataré, no lo prometo, de hacer algo así

    Saludos!

  3. Walter dijo:

    Hola.
    Como muchos, recien me inicio en java y quisiera saber como puedo leer desde comando algun dato del tipo Date mediante la clase Scanner.
    Ejm:
    System.out.println(“Ingrese fecha de nacimiento”);
    fecha_nacimiento=c.next(); this.setFecha_nacimiento(fecha_nacimiento);

    Es decir, con el next() y sus variantes puedo leer datos primitivos. Pero como podria hacer para leer un dato tipo Date.

    Gracias x su tiempo.

  4. Fernando dijo:

    Hey Hola Jorge
    Una preguntaEstuve empezando a ver Java en la Facu. ahora bien en la misma usamos Eclipse o el bloque de Notas, hasta el momento todo bien.
    Pero se me dio la idea de cureosear con Netbeans.
    Ingrese un codigo simple que me funciona normalmente en Eclipse, en alguna parte del codigo este pide datos al usario y lo hago usando el Scanner in=new Scanner bla bla bla y despues System.out. bla bla y luego dato=in.next etc etc para que ingrese datos supongamos ingresa tu nombre. Ahora en Eclipse no hay problema ingreso mi nombre en la consola le doy enter y continuo ingresando mas datos y viendo el programa ejecutandose con normalidad, pero en Netbeans despues del enter no pasa nada deberia leer el dato ingresado y continuar con el run pero ahi se queda algo parecido a lo que le pasa a Hernando con JDeveloper y lo mismo me pasa con Jbuilder, Intellij, pero en Eclipse todo Ok, ahora lo unico que se me ocurre es que despues de ingresar el dato quizas deberia tipear otra cosa en vez del enter, pero en realidad no lose, espero que me quites esta duda, de antemano muchas gracias.

  5. broder apoyeme por si acaso me puede pasar un programita sencillo donde se ingrese datos por teclado con ese metodo scanner modo consola en java especificamente programo en Sun One q recien lo toy viendo en la U

    Se lo agradeceria mucho mucho

    Carlos
    Guayaquil – Ecuador

  6. Salvador dijo:

    hola k tal disculpa ,kisiera hacerte una consulta,para ingresar datos desde el teclado yo utilizo import java.io.*; pero cuando termino todo
    me dicen k coloke el numero deseado de ahi le doy enter y cuando kiero colocar el segundo valor , todas las preguntas k me dicen k coloke los n valores mas se juntan, sabes por k pasa eso !!!

  7. Salvador dijo:

    import java.io.*;
    /**
    *
    * @author Renzo
    */
    public class categoria {

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) throws IOException{
    int categoria,colegio;
    int pensionmensual,descuento=0,importepagar;

    System.out.print(“Teclee la categoria:”);
    categoria=System.in.read();
    System.out.print(“Teclee el colegio:”);

    colegio=System.in.read();
    System.out.print(“Teclee la pension mensual:”);
    pensionmensual=System.in.read();

    switch(categoria)
    {
    case’A’:
    switch (colegio)
    { case’N’:
    descuento=(int) (pensionmensual * 0.3);
    break;
    case’P’:
    descuento=(int) (pensionmensual * 0.15);
    break;
    }

    case’B’:
    switch(colegio)
    { case’N’:
    descuento=(int) (pensionmensual * 0.4);
    break;
    case’P’:
    descuento=(int) (pensionmensual * 0.2);
    break;
    }
    case’C’:
    switch(colegio)
    { case’N’:
    descuento=(int) (pensionmensual * 0.5);
    break;
    case’P’:
    descuento=(int) (pensionmensual * 0.25);
    break;
    }

    }
    System.in.skip(1);
    importepagar=pensionmensual-descuento;
    System.out.println(“El importe a pagar es..:”+importepagar);

    }

    }
    Ahi esta ycomo utilizaria el Scanner.!!

    • Hola Salvador,

      Te explico el uso de Scanner, primero deberías reemplazar las variables categoria y colegio de tipo de dato int por char, porque más abajo usas sentencias Switch que compara caracteres (case ‘C’ por ejemplo) y un int es diferente de un char. Luego debes crear una instancia de la clase Scanner, antes de ello debes hacer el siguiente import java.util.Scanner;, algo así: Scanner lector = new Scanner(System.in);

      Luego deberías reemplazar las lecturas de colegio y categoría de System.in.read() por lector.next().charAt(0); Recuerda cambiar las variables categoria y colegio de int a char. El método charAt(0) te permite obtener el primer caracter que forma el texto (String) que estás leyendo, ya que el método next() lee un String, entonces para procesarlo debes usar el método charAt

      Y para pensión manual deberías usar lector.nextInt(); que te permite leer un valor tipo int

      Por lo demás el código debería ser el mismo.

      Saludos y espero que te ayude.

  8. Salvador dijo:

    Hola k tal hize lo k dijiste,compila pero solo toma el caso C por k??
    import java.util.Scanner;
    /**
    *
    * @author Renzo
    */
    public class categoria {

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
    Scanner lector=new Scanner(System.in);
    char categoria,colegio;
    final double PDNA = 0.30; // Descuento Colegio Nacional, Categoría A
    final double PDNB = 0.40; // Descuento Colegio Nacional, Categoría B
    final double PDNC = 0.50; // Descuento Colegio Nacional, Categoría C
    final double PDPA = 0.15; // Descuento Colegio Particular, Categoría A
    final double PDPB = 0.20; // Descuento Colegio Particular, Categoría B
    final double PDPC = 0.25; // Descuento Colegio Particular, Categoría C
    int pensionmensual,descuento=0,importepagar;

    System.out.print(“Teclee la categoria:”);
    categoria=lector.next().charAt(0);
    System.out.print(“Teclee el colegio:”);
    colegio=lector.next().charAt(0);
    System.out.print(“Teclee la pension mensual:”);
    pensionmensual=lector.nextInt();

    switch(categoria)
    {
    case’A’:
    switch (colegio)
    { case’N’:
    descuento=(int) (pensionmensual*PDNA);
    break;
    case’P’:
    descuento=(int) (pensionmensual *PDPA);
    break;
    }

    case’B’:
    switch(colegio)
    { case’N’:
    descuento=(int) (pensionmensual * PDNB);
    break;
    case’P’:
    descuento=(int) (pensionmensual * PDPB);
    break;
    }
    case’C’:
    switch(colegio)
    { case’N’:
    descuento=(int) (pensionmensual * PDNC);
    break;
    case’P’:
    descuento=(int) (pensionmensual * PDPC);
    break;
    }
    break;

    }

    importepagar=pensionmensual-descuento;
    System.out.println(“El importe a pagar es..:”+importepagar);

    k ESta mal en el codigo !!

    • Hola Salvador,

      Haz olvidado ubicar las sentencias break dentro de los casos A, B y C; por tal motivo únicamente te toma la ultima alternativa, deberías tener algo así en A, B y C:
      case’A’:
      switch (colegio)
      {
      case’N’:
      descuento=(int) (pensionmensual*PDNA);
      break;
      case’P’:
      descuento=(int) (pensionmensual *PDPA);
      break;
      }//fin switch(colegio)
      break; //break del case ‘A’

      Saludos

  9. Salvador dijo:

    hola k tal ,una ?,como hago para ordenar una matriz en filas y columnas en metodos propios , elegidos a la random,eh hecho todo pero,la matriz sale en forma vertical ..??

  10. Hola.

    No tengo ni la menor idea de comorealizar un programa en Java, que abra o cree unarchivo y leea el contenido del archivo, asi mismo contabilizando el nuemro de caracteres o palabras que este contenido en el archivo, tambien que brinde un menu en donde indique que desea realiar el usuario en donde indique si desea comprimir archivo o descomprimir archivo.

    Si no es mucha molestia, les agradeceria que me ayudaran en esto porfabor.

    Gracias por tu amable atencion

  11. Dani_Sanchez dijo:

    Muy buenas,

    soy un estudiante de telecos que esta realizando su proyecto final de carrera, dessarroyo de una aplicacion Android cn java, y me gustaria saber si sabeis de algun sitio donde pueda encontrar codigo en java, para leer codigos QR.
    Os estaria muy agradecido! Muchas gracias!!

  12. veneno 999 dijo:

    HOLA ESTOY ESTUDIANDO EN TECNOLOGICO Y PROGRAMO EN JAVA PERO HAY UN METODO QUE UTILIZA MI ASESOR QUE EN leer PERO NO ME CORRE EN EL PROGRAMA ME MARCA ERROR

  13. lulu dijo:

    hola q tal me podrian ayudar con informacion estoy iniciando en java y tengo que abrir desde modo consola alguno de 5 jframe qie contendra una imagen con pase de parametros, ademas ensequida del paso de parametrs le tengo que poner el tiempo que quiera q se abra la imagen seleccionada ,y todo desde la consola

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s