Skip to content

4. Entrada y Salida en Consola

La entrada y salida de datos es una parte fundamental de cualquier programa. En Java, existen diversas formas de interactuar con el usuario a través de la consola, permitiendo tanto la lectura de datos ingresados como la presentación de resultados.

La clase Scanner es una de las herramientas más utilizadas para la lectura de datos en Java. Pertenece al paquete java.util y proporciona métodos para leer diferentes tipos de datos desde diversas fuentes, como la entrada estándar (teclado), archivos o cadenas de texto.

Importación y creación de un objeto Scanner

Section titled “Importación y creación de un objeto Scanner”

Para utilizar la clase Scanner, primero debemos importarla y luego crear una instancia:

import java.util.Scanner;
public class EjemploScanner {
public static void main(String[] args) {
// Crear un objeto Scanner para leer de la entrada estándar (teclado)
Scanner scanner = new Scanner(System.in);
// Uso del scanner...
// Cerrar el scanner cuando ya no se necesite
scanner.close();
}
}

La clase Scanner proporciona varios métodos para leer diferentes tipos de datos:

MétodoDescripciónEjemplo
nextLine()
Lee una línea completa de texto
String nombre = scanner.nextLine();
next()
Lee la siguiente palabra (hasta encontrar un espacio)
String palabra = scanner.next();
nextInt()
Lee un valor entero
int edad = scanner.nextInt();
nextDouble()
Lee un valor decimal
double precio = scanner.nextDouble();
nextBoolean()
Lee un valor booleano (true/false)
boolean respuesta = scanner.nextBoolean();
nextLong()
Lee un valor entero largo
long poblacion = scanner.nextLong();
nextFloat()
Lee un valor decimal de precisión simple
float altura = scanner.nextFloat();
hasNext()
Verifica si hay más tokens disponibles
if (scanner.hasNext()) { ... }
hasNextInt()
Verifica si el siguiente token es un entero
if (scanner.hasNextInt()) { ... }

La lectura de datos desde la consola implica capturar la información que el usuario ingresa a través del teclado. Veamos algunos ejemplos prácticos de cómo realizar esta tarea utilizando la clase Scanner.

Ejemplo básico de lectura de diferentes tipos de datos

Section titled “Ejemplo básico de lectura de diferentes tipos de datos”
import java.util.Scanner;
public class LecturaConsola {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Lectura de una cadena (nombre)
System.out.print("Ingrese su nombre: ");
String nombre = scanner.nextLine();
// Lectura de un entero (edad)
System.out.print("Ingrese su edad: ");
int edad = scanner.nextInt();
// Consumir el salto de línea pendiente
scanner.nextLine();
// Lectura de una cadena (dirección)
System.out.print("Ingrese su dirección: ");
String direccion = scanner.nextLine();
// Lectura de un decimal (altura)
System.out.print("Ingrese su altura en metros: ");
double altura = scanner.nextDouble();
// Mostrar los datos ingresados
System.out.println("
Datos ingresados:");
System.out.println("Nombre: " + nombre);
System.out.println("Edad: " + edad + " años");
System.out.println("Dirección: " + direccion);
System.out.println("Altura: " + altura + " metros");
scanner.close();
}
}

Es importante validar la entrada del usuario para evitar errores en tiempo de ejecución:

import java.util.Scanner;
public class ValidacionEntrada {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int edad = 0;
boolean entradaValida = false;
// Validación de entrada para un entero
while (!entradaValida) {
System.out.print("Ingrese su edad: ");
if (scanner.hasNextInt()) {
edad = scanner.nextInt();
if (edad > 0 && edad < 120) { // Rango razonable para una edad
entradaValida = true;
} else {
System.out.println("Por favor, ingrese una edad válida (1-119).");
}
} else {
System.out.println("Por favor, ingrese un número entero.");
scanner.next(); // Descartar la entrada incorrecta
}
}
System.out.println("Edad ingresada: " + edad + " años");
scanner.close();
}
}

Manejo de excepciones en la lectura de datos

Section titled “Manejo de excepciones en la lectura de datos”

Otra forma de manejar entradas incorrectas es utilizando bloques try-catch:

import java.util.Scanner;
public class ManejoExcepciones {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int numero = 0;
boolean entradaValida = false;
while (!entradaValida) {
System.out.print("Ingrese un número entero: ");
try {
numero = Integer.parseInt(scanner.nextLine());
entradaValida = true;
} catch (NumberFormatException e) {
System.out.println("Error: Debe ingresar un número entero válido.");
}
}
System.out.println("Número ingresado: " + numero);
scanner.close();
}
}

Java proporciona varias formas de mostrar información en la consola. Las más comunes son a través de los métodos de la clase System.out.

Métodos principales para salida en consola

Section titled “Métodos principales para salida en consola”
MétodoDescripciónEjemplo
System.out.println()
Imprime el texto y añade un salto de línea al final
System.out.println("Hola, mundo!");
System.out.print()
Imprime el texto sin añadir un salto de línea
System.out.print("Ingrese su nombre: ");
System.out.printf()
Imprime texto formateado (similar a printf en C)
System.out.printf("Pi: %.2f", Math.PI);
public class EjemploSalida {
public static void main(String[] args) {
// Uso de println (con salto de línea)
System.out.println("Esta es la primera línea");
System.out.println("Esta es la segunda línea");
// Uso de print (sin salto de línea)
System.out.print("Esto se imprime ");
System.out.print("en la misma línea
"); //
añade un salto de línea manualmente
// Combinación de texto y variables
String nombre = "Ana";
int edad = 25;
System.out.println(nombre + " tiene " + edad + " años.");
// Impresión de valores numéricos
double precio = 19.99;
System.out.println("El precio es: $" + precio);
// Impresión de caracteres especiales
System.out.println("Comillas: "Hola"
Nueva línea Tabulación");
}
}

Concatenación de cadenas vs StringBuilder

Section titled “Concatenación de cadenas vs StringBuilder”

Para la salida de texto extenso o en bucles, es más eficiente usar StringBuilder en lugar de concatenación de cadenas:

String resultado = "";
for (int i = 1; i <= 5; i++) {
resultado += "Número " + i + "
";
}
System.out.println(resultado);

2.3.4 Formateo de salida (printf, println)

Section titled “2.3.4 Formateo de salida (printf, println)”

El formateo de salida permite presentar datos de manera más estructurada y legible. Java ofrece varias opciones para dar formato a la salida de texto.

El método printf permite formatear texto utilizando especificadores de formato, similar a C/C++:

public class FormateoSalida {
public static void main(String[] args) {
String nombre = "Carlos";
int edad = 30;
double altura = 1.75;
// Formateo básico
System.out.printf("Nombre: %s, Edad: %d, Altura: %.2f metros
", nombre, edad, altura);
// Alineación y ancho de campo
System.out.printf("%-10s | %5d | %6.2f
", "Nombre", "Edad", "Altura");
System.out.printf("%-10s | %5d | %6.2f
", nombre, edad, altura);
// Formateo de números
double precio = 1250.75;
System.out.printf("Precio: $%,.2f
", precio); // Con separador de miles y 2 decimales
// Porcentajes
double porcentaje = 0.8523;
System.out.printf("Porcentaje: %.2f%%
", porcentaje * 100); // 85.23%
// Fechas (requiere java.time)
System.out.printf("Fecha actual: %tD
", java.time.LocalDate.now());
}
}
EspecificadorTipo de datoEjemploResultado
%s
String
System.out.printf("%s", "Hola");
Hola
%d
Entero (int, long)
System.out.printf("%d", 42);
42
%f
Decimal (float, double)
System.out.printf("%f", 3.14);
3.140000
%.2f
Decimal con precisión
System.out.printf("%.2f", 3.14159);
3.14
%c
Carácter
System.out.printf("%c", 'A');
A
%b
Booleano
System.out.printf("%b", true);
true
%n
Salto de línea
System.out.printf("Linea 1%nLinea 2");
Linea 1
Linea 2
%x
Entero en hexadecimal
System.out.printf("%x", 255);
ff
%o
Entero en octal
System.out.printf("%o", 8);
10
%e
Notación científica
System.out.printf("%e", 1000.0);
1.000000e+03

Los especificadores de formato pueden incluir modificadores para controlar la presentación:

ModificadorDescripciónEjemploResultado
%5d
Ancho mínimo (alineado a la derecha)
System.out.printf("%5d", 42);
” 42” (con 3 espacios)
%-5d
Ancho mínimo (alineado a la izquierda)
System.out.printf("%-5d", 42);
“42 ” (con 3 espacios)
%05d
Relleno con ceros
System.out.printf("%05d", 42);
”00042”
%,d
Separador de miles
System.out.printf("%,d", 1000000);
”1,000,000”
%+d
Mostrar siempre el signo
System.out.printf("%+d", 42);
”+42”
%(.2f
Negativos entre paréntesis
System.out.printf("%(f", -3.14);
”(3.140000)“

Además de System.out.printf, puedes usar String.format() para crear cadenas formateadas:

String mensaje = String.format("Hola, %s. Tienes %d años.", "Juan", 25);
System.out.println(mensaje); // Imprime: Hola, Juan. Tienes 25 años.
import java.util.Date;
public class EjemploFormateoCompleto {
public static void main(String[] args) {
// Datos para formatear
String nombre = "María López";
int edad = 28;
double salario = 2567.89;
Date fecha = new Date();
System.out.println("=== Informe de Empleado ===");
// Formateo de texto y números
System.out.printf("Nombre: %-15s | Edad: %3d años
", nombre, edad);
// Formateo de valores monetarios
System.out.printf("Salario: $%,.2f
", salario);
System.out.printf("Salario anual: $%,.2f
", salario * 12);
// Formateo de porcentajes
double impuesto = 0.22;
System.out.printf("Impuesto aplicado: %.1f%%
", impuesto * 100);
System.out.printf("Salario neto: $%,.2f
", salario * (1 - impuesto));
// Formateo de fechas
System.out.printf("Fecha de informe: %tA, %td de %tB de %tY
", fecha, fecha, fecha, fecha);
System.out.printf("Hora de generación: %tH:%tM:%tS
", fecha, fecha, fecha);
// Tabla formateada
System.out.println("
=== Desglose de Pagos ===");
System.out.printf("%-15s | %10s | %10s
", "Concepto", "Monto", "Porcentaje");
System.out.printf("%-15s | %10.2f | %10.2f%%
", "Salario base", salario, 100.0);
System.out.printf("%-15s | %10.2f | %10.2f%%
", "Impuestos", salario * impuesto, impuesto * 100);
System.out.printf("%-15s | %10.2f | %10.2f%%
", "Salario neto", salario * (1 - impuesto), (1 - impuesto) * 100);
}
}

Formateo de salida con la clase MessageFormat

Section titled “Formateo de salida con la clase MessageFormat”

Para casos más complejos o cuando necesitas reutilizar el mismo patrón de formato, puedes usar la clase MessageFormat:

import java.text.MessageFormat;
public class EjemploMessageFormat {
public static void main(String[] args) {
String patron = "El {0} cuesta {1,number,currency} y fue fabricado el {2,date,long}.";
Object[] valores = {
"teléfono",
1299.99,
new java.util.Date()
};
String mensaje = MessageFormat.format(patron, valores);
System.out.println(mensaje);
// Reutilizando el mismo patrón con diferentes valores
Object[] otrosValores = {"laptop", 2499.99, new java.util.Date()};
String otroMensaje = MessageFormat.format(patron, otrosValores);
System.out.println(otroMensaje);
}
}
🐝