4. Entrada y Salida en Consola
Entrada y Salida en Consola
Section titled “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.
2.3.1 Uso de la clase Scanner
Section titled “2.3.1 Uso de la clase Scanner”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(); }}Métodos principales de la clase Scanner
Section titled “Métodos principales de la clase Scanner”La clase Scanner proporciona varios métodos para leer diferentes tipos de datos:
| Método | Descripción | Ejemplo |
|---|---|---|
| Lee una línea completa de texto | |
| Lee la siguiente palabra (hasta encontrar un espacio) | |
| Lee un valor entero | |
| Lee un valor decimal | |
| Lee un valor booleano (true/false) | |
| Lee un valor entero largo | |
| Lee un valor decimal de precisión simple | |
| Verifica si hay más tokens disponibles | |
| Verifica si el siguiente token es un entero | |
2.3.2 Lectura de datos desde consola
Section titled “2.3.2 Lectura de datos desde consola”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(); }}Validación de entrada
Section titled “Validación de entrada”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(); }}2.3.3 Escritura de datos en consola
Section titled “2.3.3 Escritura de datos en consola”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étodo | Descripción | Ejemplo |
|---|---|---|
| Imprime el texto y añade un salto de línea al final | |
| Imprime el texto sin añadir un salto de línea | |
| Imprime texto formateado (similar a printf en C) | |
Ejemplos de uso de print y println
Section titled “Ejemplos de uso de print y println”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);StringBuilder sb = new StringBuilder();for (int i = 1; i <= 5; i++) { sb.append("Número ").append(i).append("");}System.out.println(sb.toString());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.
Uso de System.out.printf
Section titled “Uso de System.out.printf”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()); }}Especificadores de formato comunes
Section titled “Especificadores de formato comunes”| Especificador | Tipo de dato | Ejemplo | Resultado |
|---|---|---|---|
| String | | Hola |
| Entero (int, long) | | 42 |
| Decimal (float, double) | | 3.140000 |
| Decimal con precisión | | 3.14 |
| Carácter | | A |
| Booleano | | true |
| Salto de línea | | Linea 1 Linea 2 |
| Entero en hexadecimal | | ff |
| Entero en octal | | 10 |
| Notación científica | | 1.000000e+03 |
Modificadores de formato
Section titled “Modificadores de formato”Los especificadores de formato pueden incluir modificadores para controlar la presentación:
| Modificador | Descripción | Ejemplo | Resultado |
|---|---|---|---|
| Ancho mínimo (alineado a la derecha) | | ” 42” (con 3 espacios) |
| Ancho mínimo (alineado a la izquierda) | | “42 ” (con 3 espacios) |
| Relleno con ceros | | ”00042” |
| Separador de miles | | ”1,000,000” |
| Mostrar siempre el signo | | ”+42” |
| Negativos entre paréntesis | | ”(3.140000)“ |
Clase String.format
Section titled “Clase String.format”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.Ejemplo completo de formateo
Section titled “Ejemplo completo de formateo”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); }}