COMPARTE ESTE ARTÍCULO

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:

  1. Añadir libros, revistas y periódicos.
  2. Listar libros, revistas y periódicos.
  3. Guardar y cargar los datos en/desde ficheros de texto y binarios.
  4. Buscar publicaciones por título o autor.
  5. Eliminar publicaciones.
  6. Manejar excepciones para operaciones como manejo de ficheros.
  7. 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

  1. Clases Publicacion, Libro, Revista, y Periodico:
    • Publicacion es una clase abstracta que sirve como base para Libro, Revista y Periodico.
    • Cada subclase hereda de Publicacion y añade atributos específicos (numeroPaginas para Libro, numeroEdicion para Revista y fecha para Periodico).
  2. Clase Biblioteca:
    • Contiene una lista dinámica (ArrayList) de publicaciones (Libro, Revista y Periodico).
    • 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.
  3. 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

Contenido restringido

Acceso de usuarios existentes
   
Registro de un nuevo usuario
*Campo necesario

Categories:

Tags:

Comments are closed

Estado de acceso
ESTADO DE ACCESO
TRADUCTORES
COMPARTENOS
error: CONTENIDO PROTEGIDO