Este ejercicio combina varios conceptos avanzados 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, revistas y periódicos.
- Listar libros, revistas y periódicos.
- Guardar y cargar los datos en/desde ficheros de texto y binarios.
- Buscar publicaciones por título o autor.
- Eliminar publicaciones.
- Manejar excepciones para operaciones como manejo de ficheros.
- Utilizar vectores unidimensionales y bidimensionales para representar algunas estructuras de datos.
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 Periodico
class Periodico extends Publicacion {
private static final long serialVersionUID = 1L;
private String fecha;
public Periodico(String titulo, String autor, String fecha) {
super(titulo, autor);
this.fecha = fecha;
}
@Override
public void mostrarInformacion() {
System.out.println("Periódico [Título: " + titulo + ", Autor: " + autor + ", Fecha: " + fecha + "]");
}
}
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);
} else if (publicacion instanceof Periodico) {
Periodico periodico = (Periodico) publicacion;
writer.write("Periodico," + periodico.getTitulo() + "," + periodico.getAutor() + "," + periodico.fecha);
}
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(",");
switch (partes[0]) {
case "Libro":
publicaciones.add(new Libro(partes[1], partes[2], Integer.parseInt(partes[3])));
break;
case "Revista":
publicaciones.add(new Revista(partes[1], partes[2], Integer.parseInt(partes[3])));
break;
case "Periodico":
publicaciones.add(new Periodico(partes[1], partes[2], partes[3]));
break;
}
}
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 buscarPublicacionPorAutor(String autor) {
for (Publicacion publicacion : publicaciones) {
if (publicacion.getAutor().equalsIgnoreCase(autor)) {
publicacion.mostrarInformacion();
}
}
}
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. Añadir periódico");
System.out.println("4. Listar publicaciones");
System.out.println("5. Guardar en fichero de texto");
System.out.println("6. Cargar desde fichero de texto");
System.out.println("7. Guardar en fichero binario");
System.out.println("8. Cargar desde fichero binario");
System.out.println("9. Buscar publicación por título");
System.out.println("10. Buscar publicación por autor");
System.out.println("11. Eliminar publicación por título");
System.out.println("12. 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:
System.out.print("Título del periódico: ");
String tituloPeriodico = scanner.nextLine();
System.out.print("Autor del periódico: ");
String autorPeriodico = scanner.nextLine();
System.out.print("Fecha del periódico: ");
String fecha = scanner.nextLine();
biblioteca.añadirPublicacion(new Periodico(tituloPeriodico, autorPeriodico, fecha));
break;
case 4:
biblioteca.listarPublicaciones();
break;
case 5:
biblioteca.guardarEnFicheroTexto();
break;
case 6:
biblioteca.cargarDesdeFicheroTexto();
break;
case 7:
biblioteca.guardarEnFicheroBinario();
break;
case 8:
biblioteca.cargarDesdeFicheroBinario();
break;
case 9:
System.out.print("Ingrese el título de la publicación a buscar: ");
String tituloBuscar = scanner.nextLine();
biblioteca.buscarPublicacionPorTitulo(tituloBuscar);
break;
case 10:
System.out.print("Ingrese el autor de la publicación a buscar: ");
String autorBuscar = scanner.nextLine();
biblioteca.buscarPublicacionPorAutor(autorBuscar);
break;
case 11:
System.out.print("Ingrese el título de la publicación a eliminar: ");
String tituloEliminar = scanner.nextLine();
biblioteca.eliminarPublicacionPorTitulo(tituloEliminar);
break;
case 12:
System.out.println("Saliendo del programa.");
break;
default:
System.out.println("Opción no válida.");
}
} while (opcion != 12);
scanner.close();
}
}
Explicación del Código
- Clases
Publicacion
,Libro
,Revista
, yPeriodico
:Publicacion
es una clase abstracta que sirve como base paraLibro
,Revista
yPeriodico
.- Cada subclase hereda de
Publicacion
y añade atributos específicos (numeroPaginas
paraLibro
,numeroEdicion
paraRevista
yfecha
paraPeriodico
).
- Clase
Biblioteca
:- Contiene una lista dinámica (
ArrayList
) de publicaciones (Libro
,Revista
yPeriodico
). - 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