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?
- Importamos la librería que contiene la clase:
import java.util.Scanner;
- Instanciamos (creamos) un objeto de tipo Scanner, guardado en una variable (normalmente llamada
teclado).
- Llamamos a los métodos de la clase Scanner para leer el teclado.
- 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.).