Java Entrada y Salida: Catálogo de Productos con Lectura y Escritura de Ficheros
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);
}
}
}