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();
}
}
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:
- El nombre del producto.
- La categoría del producto.
- El año de alta.
Después debe generar un identificador con este formato:
CAT-NOM-AAAA
Donde:
CAT son las tres primeras letras de la categoría en mayúsculas.
NOM son las tres primeras letras del nombre del producto en mayúsculas.
AAAA es el año introducido.
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.