5.a.1 Operaciones de Entrada y Salida por Consola.

Objetivo

Utlizar la consola para realizar operaciones de entrada y salida con objetos predefinidos de System y Scanner.

1. Contenidos

1.1 Entrada, proceso y salida

Ya hemos visto que un ORDENADOR es una máquina que procesa datos. En concreto, recibe datos de entrada, los procesa y devuelve datos de salida.

Por lo tanto, necesitaremos aprender cómo introducir los datos de entrada en el ordenador y cómo devolver los datos de salida. Para hacerlo, utilizaremos dos periféricos: La consola como periférico de salida y el teclado como periférico de entrada.

Para ambos periféricos utilizaremos un "objeto del sistema" que se denomina System.

1.2 Salida de Datos

Por la pantalla solo podemos mostrar datos de tipo String. Estos puede proceder de tres orígenes:

  • Un literal de String (entre comillas dobles). Por ejemplo "Hola Mundo".
  • Una variable de tipo String. Por ejemplo String nombre = "Miguel Jaque".
  • Una operación que dé como resultado un String (incluyendo las conversiones que sean necesarias). Por ejemplo: "Edad " + 57.

Para mostrar el valor de un dato por salida utilizaremos tres métodos distintos:

  • System.out.print(String). Por ejemplo System.out.print("Hola Mundo"). Este método simplemente muestra el String por pantalla.
  • System.out.println(String). Por ejemplo System.out.println(nombre). Este método muestra el String por pantalla y añade un salto de línea al final.
  • System.out.printf(String, variables). Este método nos permite "formatear" variables al mostrarlas por pantalla. Para ello, en el String se añaden códigos especiales (llamados "formateadores") que van precedidos de % y que serán sustituidos por las variables que se pasan a continuación.

Ejemplos de printf:


System.out.printf("Hola %s", nombre);        // %s se sustituye por nombre
System.out.printf("Precio: %.2f%n", 123.4567); // "Precio: 123.46" + salto
System.out.printf("%s (%.2f€)%n", nombre, precio); // "Sardinas (5.25€)"
				

Los formateadores de printf (en inglés "placeholders") tienen un montón de opciones que necesitas conocer. Puedes consultarlos en W3Schools o en la documentación oficial.

1.3 Entrada de Datos con System.in.read()

Para la entrada de datos utilizaremos el teclado, que está disponible a través del objeto del sistema System.in.

Podemos leer la tecla que pulsa el usuario utilizando el método System.in.read():


Integer codigoTecla;
codigoTecla = System.in.read();
System.out.println("El código de la tecla pulsada es: " + codigoTecla);
				

Pero lo cierto es que normalmente no queremos saber el código de la tecla, sino el carácter de la tecla. Afortunadamente, Java puede convertir un número entero en un carácter (para ello, utiliza la tabla ASCII).

El siguiente código lee el teclado y nos muestra la tecla pulsada:


Character tecla;
tecla = (char) System.in.read();
System.out.println("La tecla pulsada es: " + tecla);
				

Realmente este código necesita algunos arreglos. Como es posible que el usuario pulse CTRL+C cuando Java está esperando la entrada por teclado, o se puede producir algún otro error de E/S (Entrada/Salida), necesitamos controlar esa posible "excepción".

El código con control de la excepción es el siguiente:


import java.io.IOException;

public class Programa {
    public static void main(String[] args) throws IOException {
        Character tecla;
        tecla = (char) System.in.read();
        System.out.println("La tecla pulsada es: " + tecla);
    }
}
				

Este código incluye la importación de la librería IOException y el aviso de que el método main lanza (throws) excepciones de entrada y salida.

1.4 Entrada de Datos con la clase Scanner

Java dispone de una clase Scanner que nos facilita la lectura del teclado. ¿Cómo la utilizamos?

  1. Importamos la librería que contiene la clase: import java.util.Scanner;
  2. Instanciamos (creamos) un objeto de tipo Scanner, guardado en una variable (normalmente llamada teclado).
  3. Llamamos a los métodos de la clase Scanner para leer el teclado.
  4. Finalmente, cerramos el Scanner para liberar la memoria: teclado.close();

Ejemplo básico con Scanner:


import java.util.Scanner;  // Importamos la clase

public class Programa {
    public static void main(String[] args) {
        Scanner teclado = new Scanner(System.in);  // Creamos el objeto Scanner
        System.out.print("Nombre: ");

        String nombre = teclado.nextLine();  // Leemos hasta ENTER
        System.out.println("El nombre es: " + nombre);
        teclado.close();  // Liberamos la memoria
    }
}
				

Lectura de otros tipos de datos (conversión desde String):

La clase Scanner tiene otros métodos para leer enteros, floats, doubles, booleans... pero no es conveniente utilizarlos. Si queremos leer algún otro tipo de dato, vamos a realizar conversiones de tipo así:


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner teclado = new Scanner(System.in);
        Integer edad;
        System.out.print("¿Cuál es su edad? ");
        // edad = teclado.nextInt();  // No recomendado
        edad = Integer.valueOf(teclado.nextLine());  // Recomendado
        System.out.printf("Su edad es de %d años.", edad);
        teclado.close();
    }
}
				

Recomendación importante: Da muchos menos problemas si te acostumbras a leer siempre un texto del teclado y luego transformarlo en lo que necesites usando los wrappers (Integer.valueOf(), Double.valueOf(), etc.).

2. Ejercicios

2.1 Ejercicios básicos de salida

  1. Escribe dos sentencias: una con System.out.print("Hola"); y otra con System.out.println(" mundo");. Observa las diferencias.
  2. Declara las variables String nombre = "Ana" e Integer edad = 20. Luego haz que el programa muestre: "Nombre: Ana, Edad: 20.". Usa + para concatenar y respeta espacios, puntos y comas.
  3. Declara String producto = "Ratón"; Integer unidades = 3;. Luego, muestra por pantalla con varios print seguidos: "Producto: ", luego el nombre del producto seguido de ", Unidades: " y el número de unidades. Pon al final un println vacío. Debe aparecer todo en una línea.
  4. Utilizando solo print (no println) y con los caracteres especiales \n y \t, haz que se muestre el siguiente texto:
    Ticket:
    	Línea 1
    	Línea 2
  5. Declara Integer a = 7, b = 3;. Luego imprime en líneas separadas:
    a + b = 10
    a - b = 4
    a * b = 21
    a / b = 2 (división entera)
    a % b = 1

    El resultado de cada operación debe ser un cálculo. Muestra tanto la expresión como el resultado concatenando con +.

  6. Muestra por pantalla la información de los siguientes caracteres especiales:
    \n es un salto de línea.
    \t escribe un tabulador.
    \\ escribe la barra de escape.
    \" escribe unas comillas.
  7. Utilizando \t y \n sabiamente muestra la siguiente tabla:
    Nombre    Apellidos     Teléfono
    Ana       Pérez         123456789
    Pedro     López         987654321

2.2 Ejercicios con printf

  1. Declara una variable nombre y otra edad. Luego utiliza printf para mostrar: "Nombre: Pepa | Edad: 45" con los valores adecuados.
  2. Declara tres números decimales. Luego calcula su media y muéstrala por pantalla con tres decimales.
  3. Declara String producto = "Teclado"; Double precio = 19.99; Integer unidades = 5; Luego, utiliza printf para mostrar:
    Producto        Precio        Unidades
    Teclado         19.99€           5

    Pista: Usa %10s, %10.2f, %10d para alinear columnas (10 espacios cada una).

3. Bibliografía