6.z.1 - Uso de Textos

Objetivo

Escribir programas que usen textos

1. Contenidos

1.1 ¿Qué es un texto en Java?

En Java, los textos se representan con la clase String. Un String permite almacenar palabras, frases, códigos, mensajes, nombres de personas, direcciones de correo, identificadores de productos o cualquier dato formado por caracteres.

Los textos son uno de los tipos de datos más habituales en aplicaciones profesionales. Por ejemplo, una aplicación de gestión puede necesitar validar el nombre de un cliente, comprobar si un correo contiene una arroba, buscar productos por descripción o generar mensajes de confirmación.

Importante: String no es un tipo básico. Es una clase. Por eso dispone de métodos que nos permiten trabajar con el texto: medir su longitud, convertirlo a mayúsculas, buscar fragmentos, reemplazar caracteres, comparar cadenas, etc.

Ejemplo básico:


public class TextoBasico {
	public static void main(String[] args) {
		String cliente = "Lucía Martín";
		String mensaje = "Bienvenida al sistema, " + cliente;

		System.out.println(mensaje);
	}
}
				

1.2 Leer textos con Scanner

Para leer textos introducidos por teclado podemos usar la clase Scanner. Cuando queremos leer una línea completa, incluyendo espacios, utilizamos el método nextLine().

Esto es especialmente útil cuando el usuario puede escribir nombres compuestos, direcciones, observaciones o descripciones largas.


import java.util.Scanner;

public class LeerTexto {
	public static void main(String[] args) {
		Scanner teclado = new Scanner(System.in);

		System.out.print("Introduce el nombre del cliente: ");
		String nombre = teclado.nextLine();

		System.out.print("Introduce una observación: ");
		String observacion = teclado.nextLine();

		System.out.println("Cliente: " + nombre);
		System.out.println("Observación registrada: " + observacion);

		teclado.close();
	}
}
				

Buena práctica: Cuando trabajes con textos completos, usa nextLine(). El método next() solo lee hasta el primer espacio.

1.3 Concatenar textos

Concatenar significa unir varios textos para formar uno nuevo. En Java podemos hacerlo con el operador +. Es una operación muy frecuente para crear mensajes, etiquetas, códigos o salidas por pantalla.


public class ConcatenarTextos {
	public static void main(String[] args) {
		String codigo = "CLI-";
		Integer numero = 105;
		String nombre = "Alicia Ramos";

		String identificador = codigo + numero;
		String ficha = identificador + " - " + nombre;

		System.out.println("Ficha de cliente: " + ficha);
	}
}
				

Cuando concatenamos un texto con un número, Java convierte automáticamente el número en texto para poder unirlo.

1.4 Métodos básicos de String

Los objetos de tipo String incluyen muchos métodos que permiten consultar o transformar textos. Algunos de los más utilizados son:

Método Utilidad Ejemplo
length() Devuelve el número de caracteres. texto.length()
toUpperCase() Convierte el texto a mayúsculas. texto.toUpperCase()
toLowerCase() Convierte el texto a minúsculas. texto.toLowerCase()
trim() Elimina espacios iniciales y finales. texto.trim()
contains() Comprueba si contiene un fragmento. texto.contains("@")
replace() Sustituye caracteres o fragmentos. texto.replace(" ", "-")

Ejemplo profesional: normalizar el correo de un usuario


import java.util.Scanner;

public class NormalizarCorreo {
	public static void main(String[] args) {
		Scanner teclado = new Scanner(System.in);

		System.out.print("Introduce el correo electrónico: ");
		String correo = teclado.nextLine();

		correo = correo.trim();
		correo = correo.toLowerCase();

		System.out.println("Correo normalizado: " + correo);
		System.out.println("Número de caracteres: " + correo.length());

		teclado.close();
	}
}
				

Observación: Los métodos como trim() o toLowerCase() no modifican directamente el texto original. Devuelven un nuevo texto, por eso lo guardamos de nuevo en la variable correo.

1.5 Comparar textos correctamente

Para comparar textos en Java no debemos utilizar ==. El operador == compara referencias, no el contenido del texto. Para comparar el contenido utilizamos equals() o equalsIgnoreCase().

  • equals(): compara dos textos teniendo en cuenta mayúsculas y minúsculas.
  • equalsIgnoreCase(): compara dos textos sin distinguir mayúsculas y minúsculas.

import java.util.Scanner;

public class CompararClave {
	public static void main(String[] args) {
		Scanner teclado = new Scanner(System.in);

		String claveCorrecta = "admin2026";

		System.out.print("Introduce la clave de acceso: ");
		String claveIntroducida = teclado.nextLine();

		if (claveIntroducida.equals(claveCorrecta)) {
			System.out.println("Acceso concedido.");
		} else {
			System.out.println("Acceso denegado.");
		}

		teclado.close();
	}
}
				

Ejemplo con opción de menú:


import java.util.Scanner;

public class MenuTexto {
	public static void main(String[] args) {
		Scanner teclado = new Scanner(System.in);

		System.out.println("A - Alta de cliente");
		System.out.println("B - Baja de cliente");
		System.out.print("Elige una opción: ");
		String opcion = teclado.nextLine();

		if (opcion.equalsIgnoreCase("A")) {
			System.out.println("Has elegido alta de cliente.");
		} else if (opcion.equalsIgnoreCase("B")) {
			System.out.println("Has elegido baja de cliente.");
		} else {
			System.out.println("Opción no válida.");
		}

		teclado.close();
	}
}
				

1.6 Buscar información dentro de un texto

Muchas aplicaciones necesitan comprobar si un texto contiene determinada información. Por ejemplo, validar si un correo contiene @, si una referencia empieza por FAC o si una descripción incluye una palabra clave.

Método Utilidad
contains() Comprueba si aparece un fragmento dentro del texto.
startsWith() Comprueba si el texto empieza por un fragmento.
endsWith() Comprueba si el texto termina por un fragmento.
indexOf() Devuelve la posición en la que aparece un fragmento. Si no aparece, devuelve -1.

import java.util.Scanner;

public class ValidarReferencia {
	public static void main(String[] args) {
		Scanner teclado = new Scanner(System.in);

		System.out.print("Introduce una referencia de factura: ");
		String referencia = teclado.nextLine().trim().toUpperCase();

		if (referencia.startsWith("FAC-") && referencia.length() >= 8) {
			System.out.println("Referencia válida.");
		} else {
			System.out.println("Referencia no válida. Debe empezar por FAC- y tener al menos 8 caracteres.");
		}

		teclado.close();
	}
}
				

1.7 Extraer partes de un texto

El método substring() permite extraer una parte de un texto indicando la posición inicial y, opcionalmente, la posición final. Las posiciones empiezan en 0.

Ejemplo: En el texto FAC-2026-001, la posición 0 contiene F, la posición 1 contiene A y la posición 2 contiene C.


public class ExtraerDatosFactura {
	public static void main(String[] args) {
		String referencia = "FAC-2026-001";

		String tipo = referencia.substring(0, 3);
		String anio = referencia.substring(4, 8);
		String numero = referencia.substring(9);

		System.out.println("Tipo de documento: " + tipo);
		System.out.println("Año: " + anio);
		System.out.println("Número: " + numero);
	}
}
				

Antes de extraer posiciones concretas, conviene comprobar que el texto tiene la longitud esperada. Así evitamos errores durante la ejecución.

1.8 Recorrer un texto carácter a carácter

También podemos recorrer un texto con un bucle para analizar cada carácter. Esto permite contar vocales, detectar dígitos, comprobar espacios o construir pequeños algoritmos de validación.


import java.util.Scanner;

public class ContarVocales {
	public static void main(String[] args) {
		Scanner teclado = new Scanner(System.in);

		System.out.print("Introduce una frase: ");
		String frase = teclado.nextLine().toLowerCase();

		Integer contadorVocales = 0;

		for (Integer i = 0; i < frase.length(); i = i + 1) {
			Character letra = frase.charAt(i);

			if (letra.equals('a') || letra.equals('e') || letra.equals('i') || letra.equals('o') || letra.equals('u')) {
				contadorVocales = contadorVocales + 1;
			}
		}

		System.out.println("La frase contiene " + contadorVocales + " vocales.");

		teclado.close();
	}
}
				

1.9 Dividir un texto en partes

El método split() permite dividir un texto en varias partes usando un separador. Es muy útil para procesar datos con un formato conocido, como una línea CSV, una lista de productos o una fecha escrita con barras.


public class DividirTexto {
	public static void main(String[] args) {
		String lineaPedido = "P003;Teclado mecánico;49.95";
		String[] partes = lineaPedido.split(";");

		String codigo = partes[0];
		String producto = partes[1];
		String precio = partes[2];

		System.out.println("Código: " + codigo);
		System.out.println("Producto: " + producto);
		System.out.println("Precio: " + precio + " €");
	}
}
				

Precaución: Antes de acceder a una posición del array resultante, conviene comprobar que existen suficientes partes. Por ejemplo, si esperamos tres datos, deberíamos comprobar que partes.length == 3.

1.10 Ejemplo completo: validar datos de registro

El siguiente programa combina varias operaciones habituales con textos: lectura, limpieza, conversión a minúsculas, comprobación de longitud, búsqueda de caracteres y comparación.


import java.util.Scanner;

public class RegistroUsuario {
	public static void main(String[] args) {
		Scanner teclado = new Scanner(System.in);

		System.out.print("Nombre de usuario: ");
		String usuario = teclado.nextLine().trim();

		System.out.print("Correo electrónico: ");
		String correo = teclado.nextLine().trim().toLowerCase();

		System.out.print("Rol (ADMIN/CLIENTE): ");
		String rol = teclado.nextLine().trim();

		Boolean usuarioValido = usuario.length() >= 4;
		Boolean correoValido = correo.contains("@") && correo.endsWith(".com");
		Boolean rolValido = rol.equalsIgnoreCase("ADMIN") || rol.equalsIgnoreCase("CLIENTE");

		if (usuarioValido && correoValido && rolValido) {
			System.out.println("Registro correcto.");
			System.out.println("Usuario: " + usuario);
			System.out.println("Correo: " + correo);
			System.out.println("Rol: " + rol.toUpperCase());
		} else {
			System.out.println("El registro contiene errores.");

			if (!usuarioValido) {
				System.out.println("- El usuario debe tener al menos 4 caracteres.");
			}

			if (!correoValido) {
				System.out.println("- El correo debe contener @ y terminar en .com.");
			}

			if (!rolValido) {
				System.out.println("- El rol debe ser ADMIN o CLIENTE.");
			}
		}

		teclado.close();
	}
}
				

2. Ejercicios

2.1 Validador de correo corporativo

Crea un programa en Java llamado ValidadorCorreoCorporativo que solicite por teclado el correo electrónico de una persona empleada de una empresa.

El programa debe:

  1. Leer el correo con Scanner y nextLine().
  2. Eliminar espacios iniciales y finales.
  3. Convertir el correo a minúsculas.
  4. Comprobar que contiene una arroba @.
  5. Comprobar que termina en @empresa.com.
  6. Mostrar si el correo es válido o no.

Ejemplo de entrada: ana.lopez@empresa.com

Ejemplo de salida: Correo corporativo válido.

2.2 Analizador de incidencias

Crea un programa en Java llamado AnalizadorIncidencias que lea una descripción de una incidencia técnica escrita por un usuario.

El programa debe:

  1. Leer una frase completa con nextLine().
  2. Mostrar la frase en mayúsculas.
  3. Mostrar cuántos caracteres tiene.
  4. Indicar si contiene la palabra error, sin distinguir mayúsculas y minúsculas.
  5. Contar cuántas veces aparece la letra a.

Ejemplo de entrada: La aplicación muestra un error al guardar

Ejemplo de salida esperada:


Texto en mayúsculas: LA APLICACIÓN MUESTRA UN ERROR AL GUARDAR
Número de caracteres: 40
Contiene la palabra error: true
Número de letras a: 6
				

Reto: Generador de identificadores de producto

Una tienda online necesita generar identificadores internos para sus productos. Desarrolla un programa en Java llamado GeneradorIdentificadorProducto.

El programa debe solicitar:

  1. El nombre del producto.
  2. La categoría del producto.
  3. El año de alta.

Después debe generar un identificador con este formato:


CAT-NOM-AAAA
			

Donde:

Ejemplo:


Nombre del producto: Teclado mecánico
Categoría: Periféricos
Año de alta: 2026
Identificador generado: PER-TEC-2026
			

Mejora obligatoria: Antes de usar substring(), comprueba que el nombre y la categoría tienen al menos 3 caracteres. Si alguno de los datos no cumple esta condición, muestra un mensaje de error y no generes el identificador.

3. Bibliografía