Título: Ayuda con un ejercicio. Grabar datos en un fichero secuencial de texto.
Publicado por: Droigor en 10 Marzo 2014, 11:44 am
Lo primero un saludo. Soy nuevo en estos foros y nuevo también en la poo :) De ahí el lio tremendo que tengo con un ejercicio de clase que nos han mandado. Pego el enunciado y comento cual es el problema. Se trata de hacer una aplicación en Java que gestione los clientes de una empresa. Esos datos, se almacenarán en un fichero serializado, denominado clientes.dat. Los datos que se almacenarán sobre cada cliente son: NIF. Nombre. Teléfono. Dirección. Deuda. Mediante un menú se podrán realizar determinadas operaciones: Añadir cliente. Esta opción pedirá los datos del cliente y añadirá el registro correspondiente en el fichero. Listar clientes. Recorrerá el fichero mostrando los clientes almacenados en el mismo. Buscar clientes. Pedirá al usuario el nif del cliente a buscar, y comprobará si existe en el fichero. Borrar cliente. Pedirá al usuario el nif del cliente a borrar, y si existe, lo borrará del fichero. Borrar fichero de clientes completamente. Elimina del disco el fichero clientes.dat Salir de la aplicación. Bueno, pues el problema es que tras clear la clase y el main, no me añade ninguna linea al fichero clientes.dat, con lo que me he quedado superatascado en el apartado 1 y no puedo seguir. Pego los códigos y a ver que me podeis decir. Muchisimas gracias de antemanos. Clase principal: package tarea6; /** * * @author adec29 */ //Se implementa la interfaz serializable para que el objeto Cliente pueda //escribir todos sus datos en fichero. static ManejaClientes cliente; /** * @param args the command line arguments * @throws java.lang.Exception */ /** * Creo un cliente por defecto. No se añade al archivo. */ String dird = "13 rue del Percebe"; String ruta = "/home/droigor/Documentos/DAM/PROG - Programación/Unidad 6/Tarea/clientes.dat"; cliente = new ManejaClientes(nombred, nifd, tlfd, dird, deudad); /** * Menú * Presenta el menú de operaciones con todas las opciones disponibles */ int opcion = 0; do{ try{ opcion = Integer. parseInt(cliente. Menu()); // Mostramos el menu } System. err. println("Sólo valores entre 0 y 6"); opcion = 10; } switch (opcion){ case 0://Salir del menú break; case 1://Añadir cliente //Se crea un nuevo objeto (cliente) de la clase ManejaClientes String nombre = ManejaClientes. setNombre(); String nif = ManejaClientes. setNif(); String tlf = ManejaClientes. setTlf(); String dir = ManejaClientes. setDireccion(); String deuda = ManejaClientes. setDeuda(); // Se invoca al constructor de la clase para que nos guarde un objeto c // con los datos recién introducidos ManejaClientes c = new ManejaClientes(nombre, nif, tlf, dir, deuda); //Añadimos el nuevo cliente al fichero clientes.dat invocando el método EscribeFichero() ManejaClientes.EscribeFichero(ruta, c.getNombre(), c.getNif(), c.getDireccion(), c.getTlf(), c.getDeuda()); break; case 2://Listar clientes break; case 3://Buscar clientes break; case 4://Borrar cliente break; case 5://Borrar fichero de clientes. Ojo que no hay vuelta atrás. break; default: System. out. println("Introduzca un valor entre 0 y 6"); } }while (opcion !=0); } }
Y la clase con sus constructores y métodos. package tarea6; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.Scanner; /** * * @author droigor */ public class ManejaClientes implements java. io. Serializable { //Habilitamos la entrada de datos por teclado static Scanner teclado =new Scanner (System. in); //Atriutos private String nif ; //Nif del cliente private String nombre ; //Nombre del cliente private String telefono ; // Teléfono del cliente private String direccion ; // Dirección del cliente private String deuda ; //Deuda del dliente private static boolean check; /** * Constructor de la clase * Los datos son comprobados dentro del método que los crea * @param nombre * @param nif * @param telefono * @param direccion * @param deuda * @throws Exception */ ManejaClientes.check = false; this.nombre = nombre; this.nif = nif; this.telefono = telefono; this.direccion = direccion; this.deuda = deuda; } // Métodos set y get /** * setNombre() * @return nombre * Nos permite establecer el nombre del cliente. Verifica que el nombre * introducido es correcto siempre y cuando la longitud del String nombre * se halle entre 3 y 40 caracteres. */ public static String setNombre (){ do{ System. out. println("Introduce el nombre del cliente (3-40 caracteres):"); nombre = teclado.nextLine(); if ((nombre.length() < 3) || (nombre.length() > 40)) System. out. println("El nombre debe tener entre 3 y 40 caracteres"); } while ((nombre.length() < 3) || (nombre.length() > 40)); return nombre; } /** * setNif() * @return nif * Nos permite establecer el nif del cliente. Voy a dar por correcto una * cadena de 9 caracteres */ public static String setNif (){ do{ System. out. println("Introduce el nif del cliente (9 caracteres):"); nif = teclado.nextLine(); if ((nif.length() < 9) || (nif.length() > 9)) System. out. println("El nif debe tener 9 caracteres"); } while ((nif.length() < 9) || (nif.length() > 9)); return nif; } /** * setTlf() * @return tlf * Nos permite establecer el teléfono del cliente. Voy a dar por correcto una * cadena de 9 caracteres */ public static String setTlf (){ do{ System. out. println("Introduce el teléfono del cliente (9 caracteres):"); tlf = teclado.nextLine(); if ((tlf.length() < 9) || (tlf.length() > 9)) System. out. println("El teléfono debe tener 9 caracteres"); } while ((tlf.length() < 9) || (tlf.length() > 9)); return tlf; } /** * setDireccion() * @return dir * Nos permite establecer la dirección del cliente. Asume que la dirección * introducida es correcta siempre y cuando la longitud del String dir * se halle entre 3 y 40 caracteres. */ public static String setDireccion (){ do{ System. out. println("Introduce la dirección cliente (10-50 caracteres):"); dir = teclado.nextLine(); if ((dir.length() < 3) || (dir.length() > 40)) System. out. println("El nombre debe tener entre 10 y 50 caracteres"); } while ((dir.length() < 10) || (dir.length() > 50)); return dir; } /** * setDeuda * Nos permite establecer la cantidad que debe el cliente * @return deuda */ public static String setDeuda () { System. out. println("Indique la cantidad adeudada por el cliente: "); deuda = teclado.next(); return deuda; } /** * getNif * Nos devuelve el nif del cliente * @return nif */ return nif; } /** * getNombre * Nos devuelve el nombre del cliente * @return nombre */ return nombre; } /** * getTlf * Nos devuelve el teléfono del cliente * @return teléfono */ return telefono; } /** * getDireccion * Nos devuelve la dirección del cliente * @return direccion */ public String getDireccion () { return direccion; } /** * getDeuda * Nos devuelve la deuda que tiene el cliente * @return deuda */ return deuda; } /** * menu() * Menú de selección. Presenta el menú de opciones * @return opcion */ System. out. println("-------------------------------"); System. out. println("1 - Añadir cliente"); System. out. println("2 - Listar clientes"); System. out. println("3 - Buscar cliente"); System. out. println("4 - Borrar cliente"); System. out. println("5 - Borrar fichero clientes.dat"); System. out. println("0 - Salir"); System. out. println("-------------------------------"); String opcion = teclado. next(); return opcion; } /** * escribeFichero() * Nos permite escribir datos en el fichero clientes.dat * @param ruta - La ruta del fichero * @param nombre * @param nif * @param telefono */ //Inicializamos los objetos fichero y registro que usaremos más adelante // para crear un fichero o añadirle datos en la ruta definida en los // atributos de la clase try{ //Creo un ofjeto fichero. El true detrás de ruta es para poder añadir //contenido al fichero si existe, si no existe se crea. registro.println(); System. out. println("Error de entrada/salida."+e ); }catch (Exception ex ){//Es la excepción más general y se refiere a cualquier error de entrada y salida System. out. println("Error genérico"+ex ); } } /** * LeerFichero() * Nos permite leer del fichero clientes.dat * @param ruta * @return * @throws FileNotFoundException */ try{ //Creo el objeto del archivo a leer //Creo un objeto FileReader que abrirá el flujo de datos a leer //Creo un lector en buffer para recopilar los datos de registro //Creo una variable lectura que usaré más adelante para almacenar //la lectura del archivo y una variable de comprobación //Con este while leemos el archivo linea a linea hasta que se acaba // el fichero. Si la variable check tiene datos, se acumulan en la //variable lectura. Si check es nula ya se ha leido todo el archivo while (true){ check = br.readLine(); if (check != null) lectura=lectura+check+"n"; else break; } br.close(); registro.close(); return lectura; } System. out. println("Error:"+e. getMessage()); } return null; } }
Bueno, pues aquí está. Un saludo a todos. Rodri.
Título: Re: Ayuda con un ejercicio. Grabar datos en un fichero secuencial de texto.
Publicado por: Droigor en 10 Marzo 2014, 14:56 pm
Perdón por haber colocado esto aquí. No se como moverlo al foro de ejercicios.
Un saludo.
Título: Re: Ayuda con un ejercicio. Grabar datos en un fichero secuencial de texto.
Publicado por: Mitsug en 10 Marzo 2014, 15:33 pm
1] Estás usando archivos de texto plano como un simulador de base de datos. Los datos son: NIF, Nombre, Teléfono, Dirección y Deuda. En el archivo en donde guardaremos los datos de los clientes, tenemos que tener un separador, esto nos servirá para distinguir los datos dentro del archivo plano y para luego obtener los datos precisos dividiendo la fila por medio del separador y así obtener los tokens precisos de los datos. Ej.: 32322|Augusto|4139292|Av. Insurgentes #607|25040.40 2] Para actualizar los datos, no estoy muy seguro, te toca googlear. Primero creamos un POJO: public class Cliente { private long telefono; public Cliente() { } this.nif = nif; this.nombre = nombre; this.telefono = telefono; this.direccion = direccion; this.deuda = deuda; } return nif; } public void setNif (String nif ) { this.nif = nif; } return nombre; } public void setNombre (String nombre ) { this.nombre = nombre; } public long getTelefono() { return telefono; } public void setTelefono(long telefono) { this.telefono = telefono; } public String getDireccion () { return direccion; } public void setDireccion (String direccion ) { this.direccion = direccion; } return deuda; } public void setDeuda (Double deuda ) { this.deuda = deuda; } }
Snippets: Escribir los datos en un fichero:public static void escribirArchivo (String ruta, Cliente cliente ) { String nif = cliente. getNif(); String nombre = cliente. getNombre(); long telefono = cliente.getTelefono(); String direccion = cliente. getDireccion(); double deuda = cliente.getDeuda(); try { escritor.write(nif+"|"+nombre+"|"+telefono+"|"+direccion+"|"+deuda); escritor.flush(); } } finally { try { escritor.close(); } }
Leer archivo:public static void leerArchivo (File archivo ) { if(archivo.exists()) { try { while( (linea = lector.readLine()) != null) { String[] datos = linea. split("\\|"); System. out. println("NIF:\t"+datos [0]); System. out. println("Nombre:\t"+datos [1]); System. out. println("Teléfono:\t"+datos [2]); System. out. println("Dirección:\t"+datos [3]); System. out. println("Deuda:\t"+datos [4]); } ex.printStackTrace(); } finally { cerrarFlujos(); nullizarFlujos(); } } else { System. err. println("El archivo no existe."); } }
Ya tienes una idea de cómo hacer el resto. Te sugiero que investigues. Aquí te comparto el source(Proyecto se llama Clientes): https://www.dropbox.com/sh/23mqxxoqaysfi36/4_yCK-hlQn
Título: Re: Ayuda con un ejercicio. Grabar datos en un fichero secuencial de texto.
Publicado por: Droigor en 11 Marzo 2014, 10:19 am
Muchas gracias.
Me pongo a ello ahora mismo, a ver que tal.
Un saludo.
Título: Re: Ayuda con un ejercicio. Grabar datos en un fichero secuencial de texto.
Publicado por: mgc en 19 Marzo 2014, 16:40 pm
¿Y como se buscarían los clientes en este caso?
:huh:
Título: Re: Ayuda con un ejercicio. Grabar datos en un fichero secuencial de texto.
Publicado por: Mitsu en 19 Marzo 2014, 17:17 pm
En SOF dicen que tienes que abrir el fichero en 'modo anexado'. Esto se con el constructor de FileWriter:
UPDATE Aquí les dejo la clase utilitaria por si le es de utilidad al autor del post o a alguien más. Permite agregar un nuevo cliente, buscar un cliente por NIF y obtener todos los clientes. package pe.edu.unp.util; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import pe.edu.unp.beans.Cliente; public class FileUtil { boolean exito = false; try { archivo = new File(ruta ); // recupera los nuevos datos nif = cliente.getNif(); nombre = cliente.getNombre(); deuda = cliente.getDeuda(); escritor.write(nif+"|"+nombre+"|"+deuda.toString()); escritor.flush(); // limpia el flujo exito = true; throw ex; } finally {if(escritor != null) escritor.close();} // cierra el flujo return exito; } Cliente clienteEncontrado = null; boolean encontrado = false; try { archivo = new File(ruta ); while( (linea = lector.readLine()) != null) { String[] datos = linea. split("\\|"); // tokeniza la linea if(nif.equals(datos[0]) ) {// si el nif dado coincide con el cliente actual clienteEncontrado = new Cliente(datos[0],datos[1],deuda); encontrado = true; // cliente fue encontrado } } throw ex; } finally { if(lector != null) lector.close(); /* cierra el flujo*/ } if(encontrado) return clienteEncontrado; else return null; } List<Cliente> lista = new ArrayList<>(); try { archivo = new File(ruta ); while( (linea = lector.readLine()) != null) { String[] datos = linea. split("\\|"); // tokeniza la linea lista.add(new Cliente(datos[0],datos[1],deuda)); } throw ex; } finally { if(lector != null) lector.close(); /* cierra el flujo*/ } if(lista.isEmpty()) return null; else return lista; } }
Título: Re: Ayuda con un ejercicio. Grabar datos en un fichero secuencial de texto.
Publicado por: Droigor en 21 Marzo 2014, 21:04 pm
Ejercicio resuelto.
Muchas gracias.
He puesto los códigos en este otro post.
http://foro.elhacker.net/ejercicios/ejercicio_resuelto_gracias_por_la_ayuda-t411089.0.html (http://foro.elhacker.net/ejercicios/ejercicio_resuelto_gracias_por_la_ayuda-t411089.0.html)
Título: Ayuda con un ejercicio. Grabar datos en un fichero secuencial de texto.
Publicado por: Debci en 22 Marzo 2014, 21:31 pm
El mensaje 'Ayuda con un ejercicio. Grabar datos en un fichero secuencial de texto. (http://foro.elhacker.net/index.php?topic=410283)' fue bloqueado Considero quela temática ha sido completamente explotada. Para evitar spam, flood y demás cierro el post. Si crees que debería dejarlo abierto, tan solo tienes que decirmelo :) Gracias por tu contribución! Leer reglas: http://foro.elhacker.net/reglas
|