Este ejercicio de nivel medio combina varios conceptos fundamentales en Java: tipos de datos y operaciones de entrada y salida, estructuras básicas, programación modular y funciones, vectores unidimensionales y bidimensionales, programación orientada a objetos (POO), tratamiento de excepciones y ficheros de texto y binarios, y estructuras dinámicas de datos como ArrayList
.
Descripción del Ejercicio
Vamos a crear un sistema de gestión de biblioteca que permita:
- Añadir libros y revistas.
- Listar libros y revistas.
- Guardar y cargar los datos en/desde ficheros de texto y binarios.
- Buscar libros y revistas por título.
- Eliminar libros y revistas.
- Manejar excepciones para operaciones como manejo de ficheros.
Estructura del Código
Clase Publicacion
import java.io.Serializable;
abstract class Publicacion implements Serializable {
private static final long serialVersionUID = 1L;
protected String titulo;
protected String autor;
public Publicacion(String titulo, String autor) {
this.titulo = titulo;
this.autor = autor;
}
public String getTitulo() {
return titulo;
}
public String getAutor() {
return autor;
}
public abstract void mostrarInformacion();
}
Clase Libro
class Libro extends Publicacion {
private static final long serialVersionUID = 1L;
private int numeroPaginas;
public Libro(String titulo, String autor, int numeroPaginas) {
super(titulo, autor);
this.numeroPaginas = numeroPaginas;
}
@Override
public void mostrarInformacion() {
System.out.println("Libro [Título: " + titulo + ", Autor: " + autor + ", Páginas: " + numeroPaginas + "]");
}
}
Clase Revista
class Revista extends Publicacion {
private static final long serialVersionUID = 1L;
private int numeroEdicion;
public Revista(String titulo, String autor, int numeroEdicion) {
super(titulo, autor);
this.numeroEdicion = numeroEdicion;
}
@Override
public void mostrarInformacion() {
System.out.println("Revista [Título: " + titulo + ", Autor: " + autor + ", Edición: " + numeroEdicion + "]");
}
}
Clase Biblioteca
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
public class Biblioteca {
private ArrayList<Publicacion> publicaciones;
private static final String FICHERO_TEXTO = "biblioteca.txt";
private static final String FICHERO_BINARIO = "biblioteca.bin";
public Biblioteca() {
publicaciones = new ArrayList<>();
}
public void añadirPublicacion(Publicacion publicacion) {
publicaciones.add(publicacion);
}
public void listarPublicaciones() {
if (publicaciones.isEmpty()) {
System.out.println("No hay publicaciones para mostrar.");
} else {
for (Publicacion publicacion : publicaciones) {
publicacion.mostrarInformacion();
}
}
}
public void guardarEnFicheroTexto() {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(FICHERO_TEXTO))) {
for (Publicacion publicacion : publicaciones) {
if (publicacion instanceof Libro) {
Libro libro = (Libro) publicacion;
writer.write("Libro," + libro.getTitulo() + "," + libro.getAutor() + "," + libro.numeroPaginas);
} else if (publicacion instanceof Revista) {
Revista revista = (Revista) publicacion;
writer.write("Revista," + revista.getTitulo() + "," + revista.getAutor() + "," + revista.numeroEdicion);
}
writer.newLine();
}
System.out.println("Datos guardados en " + FICHERO_TEXTO);
} catch (IOException e) {
System.out.println("Error al guardar en fichero de texto: " + e.getMessage());
}
}
public void cargarDesdeFicheroTexto() {
try (BufferedReader reader = new BufferedReader(new FileReader(FICHERO_TEXTO))) {
String linea;
publicaciones.clear();
while ((linea = reader.readLine()) != null) {
String[] partes = linea.split(",");
if (partes[0].equals("Libro")) {
publicaciones.add(new Libro(partes[1], partes[2], Integer.parseInt(partes[3])));
} else if (partes[0].equals("Revista")) {
publicaciones.add(new Revista(partes[1], partes[2], Integer.parseInt(partes[3])));
}
}
System.out.println("Datos cargados desde " + FICHERO_TEXTO);
} catch (IOException e) {
System.out.println("Error al cargar desde fichero de texto: " + e.getMessage());
}
}
public void guardarEnFicheroBinario() {
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FICHERO_BINARIO))) {
oos.writeObject(publicaciones);
System.out.println("Datos guardados en " + FICHERO_BINARIO);
} catch (IOException e) {
System.out.println("Error al guardar en fichero binario: " + e.getMessage());
}
}
public void cargarDesdeFicheroBinario() {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FICHERO_BINARIO))) {
publicaciones = (ArrayList<Publicacion>) ois.readObject();
System.out.println("Datos cargados desde " + FICHERO_BINARIO);
} catch (IOException | ClassNotFoundException e) {
System.out.println("Error al cargar desde fichero binario: " + e.getMessage());
}
}
public void buscarPublicacionPorTitulo(String titulo) {
for (Publicacion publicacion : publicaciones) {
if (publicacion.getTitulo().equalsIgnoreCase(titulo)) {
publicacion.mostrarInformacion();
return;
}
}
System.out.println("Publicación no encontrada.");
}
public void eliminarPublicacionPorTitulo(String titulo) {
for (Publicacion publicacion : publicaciones) {
if (publicacion.getTitulo().equalsIgnoreCase(titulo)) {
publicaciones.remove(publicacion);
System.out.println("Publicación eliminada.");
return;
}
}
System.out.println("Publicación no encontrada.");
}
public static void main(String[] args) {
Biblioteca biblioteca = new Biblioteca();
Scanner scanner = new Scanner(System.in);
int opcion;
do {
System.out.println("1. Añadir libro");
System.out.println("2. Añadir revista");
System.out.println("3. Listar publicaciones");
System.out.println("4. Guardar en fichero de texto");
System.out.println("5. Cargar desde fichero de texto");
System.out.println("6. Guardar en fichero binario");
System.out.println("7. Cargar desde fichero binario");
System.out.println("8. Buscar publicación por título");
System.out.println("9. Eliminar publicación por título");
System.out.println("10. Salir");
System.out.print("Seleccione una opción: ");
opcion = scanner.nextInt();
scanner.nextLine(); // Consumir el salto de línea
switch (opcion) {
case 1:
System.out.print("Título del libro: ");
String tituloLibro = scanner.nextLine();
System.out.print("Autor del libro: ");
String autorLibro = scanner.nextLine();
System.out.print("Número de páginas: ");
int paginas = scanner.nextInt();
scanner.nextLine(); // Consumir el salto de línea
biblioteca.añadirPublicacion(new Libro(tituloLibro, autorLibro, paginas));
break;
case 2:
System.out.print("Título de la revista: ");
String tituloRevista = scanner.nextLine();
System.out.print("Autor de la revista: ");
String autorRevista = scanner.nextLine();
System.out.print("Número de edición: ");
int edicion = scanner.nextInt();
scanner.nextLine(); // Consumir el salto de línea
biblioteca.añadirPublicacion(new Revista(tituloRevista, autorRevista, edicion));
break;
case 3:
biblioteca.listarPublicaciones();
break;
case 4:
biblioteca.guardarEnFicheroTexto();
break;
case 5:
biblioteca.cargarDesdeFicheroTexto();
break;
case 6:
biblioteca.guardarEnFicheroBinario();
break;
case 7:
biblioteca.cargarDesdeFicheroBinario();
break;
case 8:
System.out.print("Ingrese el título de la publicación a buscar: ");
String tituloBuscar = scanner.nextLine();
biblioteca.buscarPublicacionPorTitulo(tituloBuscar);
break;
case 9:
System.out.print("Ingrese el título de la publicación a eliminar: ");
String tituloEliminar = scanner.nextLine();
biblioteca.eliminarPublicacionPorTitulo(tituloEliminar);
break;
case 10:
System.out.println("Saliendo del programa.");
break;
default:
System.out.println("Opción no válida.");
}
} while (opcion != 10);
scanner.close();
}
}
Explicación del Código
- **Clases
Publicacion
,Libro
, yRevista
**:Publicacion
es una clase abstracta que sirve como base paraLibro
yRevista
.- Cada subclase hereda de
Publicacion
y añade atributos específicos (numeroPaginas
paraLibro
ynumeroEdicion
paraRevista
).
- Clase
Biblioteca
:- Contiene una lista dinámica (
ArrayList
) de publicaciones (Libro
yRevista
). - Métodos para añadir, listar, buscar, eliminar publicaciones, y para guardar y cargar datos desde ficheros de texto y binarios.
- El método
main
proporciona un menú interactivo para gestionar las publicaciones.
- Contiene una lista dinámica (
- Manejo de Excepciones:
- Se manejan excepciones durante la lectura y escritura de ficheros.
- Uso de
try-with-resources
para asegurar el cierre de recursos como ficheros.
Este ejercicio proporciona una práctica completa para mejorar tus habilidades en Java, abarcando una amplia gama de conceptos y técnicas fundamentales. ¡Sigue practicando y explorando más sobre Java para convertirte en un programador más competente!
… … …
¡Coméntanos que te ha parecido este artículo al final de la página!
TÚ OPINIÓN IMPORTA
NUESTRAS ÚLTIMAS PUBLICACIONES
- La vida nos aguarda triunfos importantes. Sé resiliente.
- Creación de una Calculadora de Ecuación de Segundo Grado con HTML, CSS y JavaScript
- Comunicado a nuestros amigos, alumnos y compañeros de Valencia.
- Artículo: Funciones esenciales de C para la manipulación de cadenas: fgets, strlen, stdin, y más
- Uso de la Clase DAO sin Interfaces en Java: Ejemplo de Gestión de Trabajadores
- Uso de DAO en Java: Simplificando el Acceso a Datos con el Patrón DAO
- Guía Completa para la Creación de Gramáticas en JFLAP: Ejercicios y Soluciones
- Generación de Lenguajes en JFLAP con Gramáticas: Ejercicios y Estrategias
- Máquinas de Turing y Enumeración de Números Binarios: Diseño y Funcionamiento en JFLAP
Contenido restringido
Comments are closed