Ayuda con un ejercicio. Grabar datos en un fichero secuencial de texto.

Iniciado por Droigor, 10 Marzo 2014, 11:44 AM

0 Miembros y 1 Visitante están viendo este tema.

Droigor

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:

Código (java) [Seleccionar]
package tarea6;

/**
*
* @author adec29
*/
public class Tarea6 implements java.io.Serializable {
   //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
    */
   public static void main(String[] args) throws Exception {
      /**
       * Creo un cliente por defecto. No se añade al archivo.
       */
       String nombred = "John Doe";
       String nifd = "123456789K";
       String tlfd = "924123456";
       String dird = "13 rue del Percebe";
       String deudad = "2500";
       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
               }
           catch (NumberFormatException nfe){
               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.

Código (java) [Seleccionar]
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
    */
       
   public ManejaClientes(String nombre, String nif, String telefono,
                         String direccion, String 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(){
       String nombre = "x";
       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(){
       String nif = "x";
       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(){
       String tlf = "x";
       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(){
       String dir = "x";
       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() {
   String deuda;
   System.out.println("Indique la cantidad adeudada por el cliente: ");
   deuda = teclado.next();
   return deuda;
       
 }
   
   /**
    * getNif
    * Nos devuelve el nif del cliente
    * @return nif
    */
   public String getNif() {
       return nif;
   }

   /**
    * getNombre
    * Nos devuelve el nombre del cliente
    * @return nombre
    */
   public String getNombre() {
       return nombre;
   }

   /**
    * getTlf
    * Nos devuelve el teléfono del cliente
    * @return teléfono
    */
   public String getTlf() {
       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
    */
   public String getDeuda() {
       return deuda;
   }
   
   /**
    * menu()
    * Menú de selección. Presenta el menú de opciones
    * @return opcion
    */
   public String Menu(){
   System.out.println("Menú");
   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
    */
   public static void EscribeFichero(String ruta, String nombre, String nif, String telefono,
                         String direccion, String deuda){
       //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
        FileWriter fichero;
        PrintWriter registro;
       
        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.
           fichero = new FileWriter(ruta, true);
           registro = new PrintWriter(fichero);
           registro.println();

            } catch (IOException e) {
            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
    */
   public static String LeerFichero (String ruta) throws FileNotFoundException{
       try{
           File fichero;
           FileReader registro;
           //Creo el objeto del archivo a leer
           fichero=new File(ruta);
           //Creo un objeto FileReader que abrirá el flujo de datos a leer
           registro=new FileReader(fichero);
           //Creo un lector en buffer para recopilar los datos de registro
           BufferedReader br= new BufferedReader(registro);
           //Creo una variable lectura que usaré más adelante para almacenar
           //la lectura del archivo y una variable de comprobación
           String lectura="";
           String check=" ";
           //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;
       }
           catch (IOException e){
                   System.out.println("Error:"+e.getMessage());
                   }
           return null;
           
       }

       
                 
   }


Bueno, pues aquí está.
Un saludo a todos.
Rodri.

Se bueno, ten un buen día.

Droigor

Perdón por haber colocado esto aquí. No se como moverlo al foro de ejercicios.

Un saludo.
Se bueno, ten un buen día.

Mitsug

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:

Código (=java) [Seleccionar]

public class Cliente {
   
    private String nif;
    private String nombre;
    private long telefono;
    private String direccion;
    private Double deuda;
   
    public Cliente() {
       
    }

    public Cliente(String nif, String nombre, long telefono, String direccion, Double deuda) {
        this.nif = nif;
        this.nombre = nombre;
        this.telefono = telefono;
        this.direccion = direccion;
        this.deuda = deuda;
    }

    public String getNif() {
        return nif;
    }

    public void setNif(String nif) {
        this.nif = nif;
    }

    public String getNombre() {
        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;
    }

    public Double getDeuda() {
        return deuda;
    }

    public void setDeuda(Double deuda) {
        this.deuda = deuda;
    }
   
   
}


Snippets:

Escribir los datos en un fichero:
Código (=java) [Seleccionar]

public static void escribirArchivo(String ruta, Cliente cliente) {

File archivo = new File(ruta);
BufferedWriter escritor = null;
               String nif = cliente.getNif();
               String nombre = cliente.getNombre();
               long telefono = cliente.getTelefono();
               String direccion = cliente.getDireccion();
               double deuda = cliente.getDeuda();

try {
escritor = new BufferedWriter(new FileWriter(archivo));
                              escritor.write(nif+"|"+nombre+"|"+telefono+"|"+direccion+"|"+deuda);
                              escritor.flush();
               }
               catch(IOException e) {
           
               }
               finally { try {
                             escritor.close();
                           } catch (IOException ex) {
              }
}


Leer archivo:
Código (=java) [Seleccionar]

public static void leerArchivo(File archivo) {

        if(archivo.exists()) {
            String linea = null;
            try {
                lector = new BufferedReader(new FileReader(archivo));         
                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]);
                }
            } catch(IOException | NullPointerException ex) {
                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

Droigor

Muchas gracias.

Me pongo a ello ahora mismo, a ver que tal.

Un saludo.
Se bueno, ten un buen día.

mgc


Mitsu

En SOF dicen que tienes que abrir el fichero en 'modo anexado'. Esto se con el constructor de FileWriter:

Código (=java) [Seleccionar]

FileWriter(File archivo, boolean anexado)


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.

Código (=java) [Seleccionar]

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 {

public static boolean agregarCliente(String ruta, Cliente cliente) throws IOException, FileNotFoundException {
File archivo = null;
BufferedWriter escritor = null;
boolean exito = false;
String nif = null;
String nombre = null;
BigDecimal deuda = null;

try {
archivo = new File(ruta);
escritor = new BufferedWriter(new FileWriter(archivo.getAbsolutePath(), true));
// 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;
} catch (IOException ex) {
throw ex;
} finally {if(escritor != null) escritor.close();} // cierra el flujo

return exito;

}

public static Cliente buscarClientePorNif(String nif, String ruta) throws IOException {
File archivo = null;
BufferedReader lector = null;
Cliente clienteEncontrado = null;
boolean encontrado = false;

try {
archivo = new File(ruta);
lector = new BufferedReader(new FileReader(archivo));
String linea = null;
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
BigDecimal deuda = BigDecimal.valueOf(Double.valueOf(datos[2]));
clienteEncontrado = new Cliente(datos[0],datos[1],deuda);
encontrado = true; // cliente fue encontrado
}
}
} catch (IOException ex) {
throw ex;
} finally { if(lector != null) lector.close(); /* cierra el flujo*/ }

if(encontrado) return clienteEncontrado;
else return null;

}

public static List<Cliente> obtenerAllClientes(String ruta) throws IOException {
List<Cliente> lista = new ArrayList<>();

File archivo = null;
BufferedReader lector = null;

try {
archivo = new File(ruta);
lector = new BufferedReader(new FileReader(archivo));
String linea = null;
while( (linea = lector.readLine()) != null) {
String[] datos = linea.split("\\|"); // tokeniza la linea
BigDecimal deuda = BigDecimal.valueOf(Double.valueOf(datos[2]));
lista.add(new Cliente(datos[0],datos[1],deuda));
}
} catch (IOException ex) {
throw ex;
} finally { if(lector != null) lector.close(); /* cierra el flujo*/ }

if(lista.isEmpty()) return null;
else return lista;

}

}

Droigor

Se bueno, ten un buen día.

Debci

El mensaje 'Ayuda con un ejercicio. Grabar datos en un fichero secuencial de texto.' 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