Java Entrada y Salida: Catálogo de Productos con Lectura y Escritura de Ficheros

Computer science7.05 KB

Entrada y salida en Java: catálogo de productos

A continuación se muestran las clases EntradaSalida, Producto, Catalogo y principal, que permiten introducir productos por teclado, mostrar el catálogo y guardarlo o leerlo desde un fichero.

Clase EntradaSalida

Esta clase centraliza la lectura de datos por teclado y el acceso a ficheros.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Scanner;

public class EntradaSalida {
    private static Scanner teclado = new Scanner(System.in);

    public static String leeString(String mensaje) {
        System.out.println(mensaje);
        return teclado.nextLine();
    }

    public static float leeFloat(String mensaje) {
        System.out.println(mensaje);
        float dato = 0;
        boolean error;
        do {
            try {
                dato = teclado.nextFloat();
                error = false;
            } catch (Exception e) {
                error = true;
                System.out.println("Error, introduce un float");
            }
        } while (error == true);

        return dato;
    }

    public static int leeInt(String peticion) {
        boolean error;
        int entero = 0;

        do {
            System.out.println(peticion);

            try {
                entero = teclado.nextInt();
                error = false;
            } catch (Exception e) {
                error = true;
                System.out.println("Error, introduce un número entero");
            }
            teclado.nextLine();
        } while (error == true);
        return entero;
    }

    public static Producto crearProducto() {
        Producto p = new Producto();
        p.setNombre(leeString("Introduce el nombre del producto: "));
        p.setPrecioKg(leeFloat("Introduce el precio/kg del producto: "));
        teclado.nextLine();
        return p;
    }

    public static int numeroProductos() {
        return EntradaSalida.leeInt("Introduce el número de productos que desea introducir: ");
    }

    public static void leeFichero(String nombreFichero) {
        FileReader fichero;
        BufferedReader lector = null;
        String linea;
        try {
            fichero = new FileReader(nombreFichero);
            lector = new BufferedReader(fichero);
            while ((linea = lector.readLine()) != null) {
                System.out.println(linea);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            if (lector != null) {
                lector.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void escribeFichero(String nombreFichero, String cadena) {
        FileWriter fichero;
        BufferedWriter escritor = null;
        try {
            fichero = new FileWriter(nombreFichero);
            escritor = new BufferedWriter(fichero);
            escritor.write(cadena);
            System.out.println(""); // Salto de línea
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            if (escritor != null) {
                escritor.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static int leeIntEnRango(int min, int max) {
        int opcion;
        do {
            opcion = leeInt("Introduce un entero entre " + min + " y " + max);
        } while (opcion != min && opcion != max);
        return opcion;
    }
}

Clase Producto

Representa un producto con nombre, precio por kilo y un identificador único generado automáticamente.

public class Producto {
    private String nombre;
    private float precioKg;
    private int id;

    // Atributo static para el contador (para poder llamarlo desde el constructor)
    private static int contadorProducto;

    static {
        contadorProducto = 0;
    }

    // Constructor de Producto
    public Producto() {
        id = contadorProducto;
        contadorProducto++;
    }

    // Getters y Setters
    public int getId() {
        return id;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public float getPrecioKg() {
        return precioKg;
    }

    public void setPrecioKg(float precioKg) {
        this.precioKg = precioKg;
    }

    @Override
    public String toString() {
        return id + ";" + nombre + ";" + precioKg;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 41 * hash + this.id;
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Producto other = (Producto) obj;
        return true;
    }
}

Clase Catalogo

Almacena los productos en un array de tamaño fijo y devuelve su listado en formato texto.

public class Catalogo {
    private int contador = 0;
    private Producto productos[] = new Producto[contador];

    public Catalogo(int tamanio) {
        productos = new Producto[tamanio];
    }

    public void addProducto(Producto p) {
        try {
            productos[contador] = p;
            contador++;
        } catch (Exception e) {
            System.out.println("El array está lleno");
        }
    }

    public String[] listado() {
        String array[] = new String[contador];
        for (int x = 0; x < contador; x++) {
            array[x] = productos[x].toString();
        }
        return array;
    }
}

Clase principal

Solicita los productos al usuario y permite mostrarlos por pantalla o guardarlos en un fichero, con la opción de leerlo después.

public class Principal {

    public static void main(String[] args) {
        int n = EntradaSalida.numeroProductos();
        Catalogo c = new Catalogo(n);

        for (int x = 0; x < n; x++) {
            c.addProducto(EntradaSalida.crearProducto());
        }
        String[] datosCatalogo = c.listado();
        String stringCatalogoEntero = "";
        for (String elemento : datosCatalogo) {
            stringCatalogoEntero += elemento + "\n";
        }

        System.out.println("0 Para guardar en fichero / 1 para mostrar: ");
        if (EntradaSalida.leeIntEnRango(0, 1) == 0) {
            String nombreFichero = EntradaSalida.leeString("Dame el nombre del fichero: ");

            EntradaSalida.escribeFichero(nombreFichero, stringCatalogoEntero);

            System.out.println("¿Desea leer el fichero de productos? 0 Sí, 1 No");
            if (EntradaSalida.leeIntEnRango(0, 1) == 0) {
                EntradaSalida.leeFichero(nombreFichero);
            } else {
                System.out.println("Adiós");
            }
        } else {
            System.out.println(stringCatalogoEntero);
        }
    }
}

Download

PDF Word HTML