Buscar en ELMED

sábado, 19 de mayo de 2012

Manejo de Archivos o Ficheros en Java(Agregar,Buscar,Modificar,Eliminar)

Java proporciona un numero amplio de clases, muy útiles para trabajar sobre ficheros a través del paquete Java.io . Para ver un ejemplo del poder de este paquete vamos a crear una pequeña clase que nos permita crear y eliminar  ficheros además que posibilite buscar,modificar, y eliminar registros dentro del archivo.
Comencemos por crear el fichero, pero primero debemos hacer uso de la clase File, que es la que nos proporciona información a cerca del archivo:
/*Creo un objeto File. Recibe como parámetro la ruta completa con el
 *nombre del fichero Para los usuarios de Windows la ruta seria
 *mas o menos así:"c:\\MiFichero.txt"*/
File Ffichero=new File("/home/luis/Documentos/MiFichero.txt");
La siguiente función crea un fichero si no existe y escribe en el una cadena que recibe como parámetro.

public static void EcribirFichero(File Ffichero,String SCadena){
  try {
          //Si no Existe el fichero lo crea
           if(!Ffichero.exists()){
               Ffichero.createNewFile();
           }
          /*Abre un Flujo de escritura,sobre el fichero con codificacion utf-8. 
           *Además  en el pedazo de sentencia "FileOutputStream(Ffichero,true)",
           *true es por si existe el fichero seguir añadiendo texto y no borrar lo que tenia*/
          BufferedWriter Fescribe=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(Ffichero,true), "utf-8"));
          /*Escribe en el fichero la cadena que recibe la función. 
           *el string "\r\n" significa salto de linea*/
          Fescribe.write(SCadena + "\r\n");
          //Cierra el flujo de escritura
          Fescribe.close();
       } catch (Exception ex) {
          //Captura un posible error le imprime en pantalla 
          System.out.println(ex.getMessage());
       } 
}
La siguiente función permite leer el contenido de un fichero de texto linea a linea
/*Función que lee el contenido de un fichero de texto
*Parámetro:Ffichero. Objeto de la clase file donde se va a leer*/    
public static  void LeerFichero(File Ffichero){
   try {
       /*Si existe el fichero*/
       if(Ffichero.exists()){
           /*Abre un flujo de lectura a el fichero*/
           BufferedReader Flee= new BufferedReader(new FileReader(Ffichero));
           String Slinea;
           System.out.println("**********Leyendo Fichero***********");
           /*Lee el fichero linea a linea hasta llegar a la ultima*/
           while((Slinea=Flee.readLine())!=null) {
           /*Imprime la linea leida*/    
           System.out.println(Slinea);              
           }
           System.out.println("*********Fin Leer Fichero**********");
           /*Cierra el flujo*/
           Flee.close();
         }else{
           System.out.println("Fichero No Existe");
         }
   } catch (Exception ex) {
       /*Captura un posible error y le imprime en pantalla*/ 
        System.out.println(ex.getMessage());
   }
 }
Para borrar un archivo usamos este método.
/* Método que borra un fichero si existe
 *Parámetro:Ffichero. Objeto de la clase file donde se va a borrar
 */    
public static  void BorrarFichero(File Ffichero){
     try {
         /*Si existe el fichero*/
         if(Ffichero.exists()){
           /*Borra el fichero*/  
           Ffichero.delete(); 
           System.out.println("Fichero Borrado con Exito");
         }
     } catch (Exception ex) {
         /*Captura un posible error y le imprime en pantalla*/ 
          System.out.println(ex.getMessage());
     }
} 
Para modificar un registro dentro de un fichero.
/***********************************************************
 * Modificar un fichero de texto, consiste en leer un archivo
 *y escribir su con tenido en uno nuevo llamado X, excepto la 
 *linea a modificar que se remplaza con la linea nueva.Luego
 *se borra el fichero inicial y se renombra el nuevo fichero
 *con el nombre del archivo inicial 
 ***********************************************************
 *PARÁMETROS:
 *FficheroAntiguo:Objeto File del fichero a modificar
 *Satigualinea:Linea que se busca para modificar
 *Snuevalinea:Linea con la que se va a remplazar la vieja
 ***********************************************************/
    public static  void ModificarFichero(File FficheroAntiguo,String Satigualinea,String Snuevalinea){        
        /*Obtengo un numero aleatorio*/
        Random numaleatorio= new Random(3816L); 
        /*Creo un nombre para el nuevo fichero apartir del
         *numero aleatorio*/
        String SnombFichNuev=FficheroAntiguo.getParent()+"/auxiliar"+String.valueOf(Math.abs(numaleatorio.nextInt()))+".txt";
        /*Crea un objeto File para el fichero nuevo*/
        File FficheroNuevo=new File(SnombFichNuev);
        try {
            /*Si existe el fichero inical*/
            if(FficheroAntiguo.exists()){
                /*Abro un flujo de lectura*/
                BufferedReader Flee= new BufferedReader(new FileReader(FficheroAntiguo));
                String Slinea;
                /*Recorro el fichero de texto linea a linea*/
                while((Slinea=Flee.readLine())!=null) { 
                    /*Si la lia obtenida es igual al la bucada
                     *para modificar*/
                    if (Slinea.toUpperCase().trim().equals(Satigualinea.toUpperCase().trim())) {
                       /*Escribo la nueva linea en vez de la que tenia*/
                        EcribirFichero(FficheroNuevo,Snuevalinea);
                    }else{
                        /*Escribo la linea antigua*/
                         EcribirFichero(FficheroNuevo,Slinea);
                    }             
                }
                /*Obtengo el nombre del fichero inicial*/
                String SnomAntiguo=FficheroAntiguo.getName();
                /*Borro el fichero inicial*/
                BorrarFichero(FficheroAntiguo);
                /*renombro el nuevo fichero con el nombre del 
                *fichero inicial*/
                FficheroNuevo.renameTo(FficheroAntiguo);
                /*Cierro el flujo de lectura*/
                Flee.close();
            }else{
                System.out.println("Fichero No Existe");
            }
        } catch (Exception ex) {
            /*Captura un posible error y le imprime en pantalla*/ 
             System.out.println(ex.getMessage());
        }
    }
Para eliminar un registro dentro del fichero
/***********************************************************
        *Eliminar un registro dentro de un fichero de texto, 
        *consiste en leer un archivo y escribir su contenido en uno 
        *nuevo llamado X, excepto la linea a eliminar.Luego se borra 
        *el fichero inicial y se renombra el nuevo fichero con el 
        *nombre del archivo inicial 
        ***********************************************************
        *PARÁMETROS:
        *FficheroAntiguo:Objeto File del fichero a eliminar el reg
        *Satigualinea:Linea que se busca para eliminar
        ***********************************************************/    
       public static  void EliminarRegistro(File FficheroAntiguo,String Satigualinea){        
        /*Obtengo un numero aleatorio*/
        Random numaleatorio= new Random(3816L); 
        /*Creo un nombre para el nuevo fichero apartir del
         *numero aleatorio*/
        String SnombFichNuev=FficheroAntiguo.getParent()+"/auxiliar"+String.valueOf(Math.abs(numaleatorio.nextInt()))+".txt";
        /*Crea un objeto File para el fichero nuevo*/
        File FficheroNuevo=new File(SnombFichNuev);
        try {
            /*Si existe el fichero inical*/
            if(FficheroAntiguo.exists()){
                /*Abro un flujo de lectura*/
                BufferedReader Flee= new BufferedReader(new FileReader(FficheroAntiguo));
                String Slinea;
                /*Recorro el fichero de texto linea a linea*/
                while((Slinea=Flee.readLine())!=null) { 
                     /*Si la linea obtenida es distinta al la buscada
                     *para eliminar*/
                    if (!Slinea.toUpperCase().trim().equals(Satigualinea.toUpperCase().trim())) {
                       /*la escribo en el fichero nuevo*/ 
                       EcribirFichero(FficheroNuevo,Slinea);
                    }else{
                        /*Si es igual simple mete no hago nada*/
                    }             
                }
                /*Obtengo el nombre del fichero inicial*/
                String SnomAntiguo=FficheroAntiguo.getName();
                /*Borro el fichero inicial*/
                BorrarFichero(FficheroAntiguo);
                /*renombro el nuevo fichero con el nombre del fichero inicial*/
                FficheroNuevo.renameTo(FficheroAntiguo);
                /*Cierro el flujo de lectura*/
                Flee.close();
            }else{
                System.out.println("Fichero No Existe");
            }
        } catch (Exception ex) {
             System.out.println(ex.getMessage());
        }
    }
Bueno es todo por ahora a cerca de fichero acepto sugerencias o correcciones. pueden descargar un ejemplo completo hecho en netbeans desde aquí.

16 comentarios:

  1. Hola amigo, primeramente muchas gracias por este programa, lo utilice para una de mis clases, pero al correrlo en eclipse, en mi maquina con windows 7, no funcionaba el modulo de eliminar, revisando el código el método eliminar, en la linea 44 el Flee.close(); tiene que ir antes de borrar el fichero antiguo y renombrar el nuevo, aprox. en la linea 37, así el método funciona perfecto. saludos y gracias.

    ResponderEliminar
  2. Lo mismo en el método de Modificar se tiene que cambiar el Flee.close(); antes de renombrar y borrar , si no es problema ya tengo este programa corregido y agregado el modulo de buscar, puedo publicarlo manteniendo todo el crédito a ti. saludos.

    ResponderEliminar
    Respuestas
    1. Divinoman en realidad no se que decirte, tengo mi maquina en linux, pero si en windows pasa eso debe ser algún permiso. Déjame y lo pruebo para responderte. Ah y gracias por la anotación, este es uno de mis primeros post y no cae nada mal.

      Eliminar
  3. bien pero se puede mejorar.. y simplificar usando listas.

    ResponderEliminar
  4. Muchas gracias !! Muy buen aporte me ha ayudado bastante :)

    ResponderEliminar
  5. Necesito ayuda con esto!! si me pudieran ayudar!! por fa! gracias...


    Funcionalidad de Búsqueda
    1. El usuario ingresa lo que está buscando en el campo Búsqueda y presiona Buscar. 2. La aplicación busca entre los archivos de su directorio designado (fijo), los cuales contengan en su nombre la cadena que ha ingresado el usuario. Se considerarán puntos extra si la búsqueda se hace más inteligente. Por ejemplo, buscando las palabras en cualquier orden, en vez de la frase exacta; o buscando en el contenido del archivo, no sólo en el nombre. 3. La aplicación coloca los nombres de los archivos que coindicieron con la búsqueda en un arreglo, que luego utiliza para llenar la lista Resultados de la búsqueda de la derecha. 4. El usuario selecciona el resultado que le interesa de la lista. 5. La aplicación llena los campos Autor y Título utilizando el nombre del archivo, y el campo Letra leyendo su contenido. Tener en cuenta el caracter especial que se utilizó al formar el nombre del archivo. 6. Por cada cambio de selección que el usuario haga en la lista, la aplicación actualiza los campos con los valores nuevos. 7. El usuario puede modificar el registro que se está mostrando en la ventana y presionar Guardar, en cuyo caso la aplicación realiza las acciones 4 y 5 de la funcionalidad Agregar Letra, tal como si fuera un registro nuevo.

    ResponderEliminar
  6. probé el código del primer ejemplo, el cual fue añadir mas de un registro al archivo .txt y me funciono muy bien, les dejo el código para que lo prueben, el codigo lo que hace es ingresar por consola unos datos y luego graba en el disco d, el fichero con los datos, ustedes pueden manipular donde guardar el archivo donde dice "d:\\fichero.txt", saludos espero les sirva

    package cl.gustavo;

    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.OutputStreamWriter;
    import java.util.Scanner;

    public class DatosArchivoMas {
    public static void main(String[] args) {

    //declaracion
    @SuppressWarnings("resource")
    Scanner sc = new Scanner(System.in);

    int rut;
    String nombre;
    String dire;
    String email;


    //ingreso datos
    //rut;nombre;direccion;email


    System.out.print("Introduzca su Rut: ");
    rut = sc.nextInt();

    System.out.print("Introduzca su Nombre: ");
    nombre = sc.nextLine();

    System.out.print("Introduzca su Direccion: ");
    dire = sc.nextLine();

    System.out.print("Introduzca su Email: ");
    email = sc.nextLine();




    //imprimir
    System.out.println("Rut es:" + rut);
    System.out.println("Nombre Es: " + nombre);
    System.out.println("Tu Direccion es:" + dire);
    System.out.println("Tu email es:" + email);



    String sFichero = "d:\\fichero.txt";
    File fichero = new File(sFichero);


    try{


    if(!fichero.exists()){
    fichero.createNewFile();
    }
    /*Abre un Flujo de escritura,sobre el fichero con codificacion utf-8.
    *Además en el pedazo de sentencia "FileOutputStream(Ffichero,true)",
    *true es por si existe el fichero seguir añadiendo texto y no borrar lo que tenia*/

    BufferedWriter Fescribe=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fichero,true), "utf-8"));

    Fescribe.write("Ingrese Rut : "+rut);
    Fescribe.newLine();
    Fescribe.write("Ingrese Nombre : "+nombre);
    Fescribe.newLine();
    Fescribe.write("Ingrese Direccion : "+dire);
    Fescribe.newLine();
    Fescribe.write("Ingrese Email : "+email);
    Fescribe.newLine();
    Fescribe.write(+rut+";"+nombre+";"+dire+";"+email);


    System.out.println("Tus Datos han Sido Grabados al fichero");
    // Hay que cerrar el fichero


    //Cierra el flujo de escritura
    Fescribe.close();
    } catch (Exception ex) {
    //Captura un posible error le imprime en pantalla
    System.out.println(ex.getMessage());

    }
    }



    }

    ResponderEliminar
  7. Saludos. estoy guardando pacientes en un archivo binario: numero de expediente, dni, apellidos, nombres, telefono, direccion y fotografia. cuando hago la busqueda a traves del numero del expediente, solo puedo buscar al ultimo paciente ingresado ya que a los anteriores no se encuentran en el archivo binario, al parecer el problema se presenta al guardar los datos se sobreescriben y no lo agregan. aqui les dejo los codigos de guardar y buscar respectivamente a ver si me ayudan. gracias.

    private void btcGuardarActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    Object nombreArchivo = archivo;
    System.out.println(nombreArchivo);
    try{
    ObjectOutputStream fileout = new ObjectOutputStream(new FileOutputStream((String) nombreArchivo));
    fileout.writeObject(txtNroExpediente.getText());
    fileout.writeObject(txtDni.getText());
    fileout.writeObject(txtApellidos.getText());
    fileout.writeObject(txtNombres.getText());
    fileout.writeObject(txtDireccion.getText());
    fileout.writeObject(txtTelefono.getText());
    fileout.writeObject(lblFoto.getIcon());
    fileout.flush();
    JOptionPane.showMessageDialog(null, "Los datos del paciente se guardaron corecttamente...");
    if(fileout!=null){
    fileout.close();
    }
    }catch(IOException e){}
    desactivarTextFields();
    btcGuardar.setEnabled(false);
    btcNuevo.setEnabled(true);
    btcBuscar.setEnabled(false);
    }

    private void btcBuscarActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    Object nombreArchivo = archivo;
    try{
    try (ObjectInputStream filein = new ObjectInputStream(new FileInputStream((String) nombreArchivo))){
    Object expediente = filein.readObject();
    Object dni = filein.readObject();
    Object apellidos = filein.readObject();
    Object nombres = filein.readObject();
    Object direccion = filein.readObject();
    Object telefono = filein.readObject();
    Object foto = filein.readObject();
    if (txtNroExpediente.getText().equals(expediente)){
    txtNroExpediente.setText((String) expediente);
    txtDni.setText((String) dni);
    txtApellidos.setText((String) apellidos);
    txtNombres.setText((String) nombres);
    txtDireccion.setText((String) direccion);
    txtTelefono.setText((String) telefono);
    lblFoto.setIcon((Icon) foto);
    }
    if(filein!=null){
    filein.close();
    }
    } catch (ClassNotFoundException ex) {
    Logger.getLogger(JDPacientes.class.getName()).log(Level.SEVERE, null, ex);
    }
    }catch(IOException e){}
    }

    ResponderEliminar
  8. Saludos

    Guardo los datos de los pacientes: numero de expediente, dni, apellidos, nombres, telefono, direccion y fotografia en un archivo binario, pero al parecer se sobreescribe el archivo, por eso cuando busco solo me muestra el ultimo ingresado, dejo aqui los codigos de guardar y buscar respectivament para que me puedan ayudar. gracias:

    private void btcGuardarActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    Object nombreArchivo = archivo;
    System.out.println(nombreArchivo);
    try{
    ObjectOutputStream fileout = new ObjectOutputStream(new FileOutputStream((String) nombreArchivo));
    fileout.writeObject(txtNroExpediente.getText());
    fileout.writeObject(txtDni.getText());
    fileout.writeObject(txtApellidos.getText());
    fileout.writeObject(txtNombres.getText());
    fileout.writeObject(txtDireccion.getText());
    fileout.writeObject(txtTelefono.getText());
    fileout.writeObject(lblFoto.getIcon());
    JOptionPane.showMessageDialog(null, "Los datos del paciente se guardaron corecttamente...");
    if(fileout!=null){
    fileout.close();
    }
    }catch(IOException e){}
    }

    private void btcBuscarActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    Object nombreArchivo = archivo;
    try{
    try (ObjectInputStream filein = new ObjectInputStream(new FileInputStream((String) nombreArchivo))){
    Object expediente = filein.readObject();
    Object dni = filein.readObject();
    Object apellidos = filein.readObject();
    Object nombres = filein.readObject();
    Object direccion = filein.readObject();
    Object telefono = filein.readObject();
    Object foto = filein.readObject();
    if (txtNroExpediente.getText().equals(expediente)){
    txtNroExpediente.setText((String) expediente);
    txtDni.setText((String) dni);
    txtApellidos.setText((String) apellidos);
    txtNombres.setText((String) nombres);
    txtDireccion.setText((String) direccion);
    txtTelefono.setText((String) telefono);
    lblFoto.setIcon((Icon) foto);
    }
    if(filein!=null){
    filein.close();
    }
    } catch (ClassNotFoundException ex) {
    Logger.getLogger(JDPacientes.class.getName()).log(Level.SEVERE, null, ex);
    }
    }catch(IOException e){}
    }

    ResponderEliminar
  9. me dejaron una tarea, hay les va. suponiendo que en el archivo de texto en la primera linea tengo: 1;¿cuanto es 2+2?;B. y el usuariodebe selecionar el numero de la pregunta y la respuesta, que en este caso seria B.(aclaro: abajo abrian muchas mas preguntas). pregunta: ¿como hago para que me evalue que en la misma linea este la pregunta 1 y la respuesta B?, porque ya lo he hecho pero siempre me busca en todo el archivo

    ResponderEliminar
  10. Me podrian ayudar en modificar datos de archivos de texto, pero pormedio de una busqueda de una clave..

    ResponderEliminar
  11. Estoy elaborando un proyecto, donde necesito modificar datos por medio de una busqueda en este caso manejo una clave, por esa clave encontrada necesito modificar todos los datos de ello sin modificar la clave.. me podrian alludar..

    ResponderEliminar
  12. hola te consulto,. no se como hacer para eliminar un registro que contiene cada uno sus id, y que al borrar uno, el siguiente tome su id.. por ejemplo: borro el registro 0006, y quiero que el 0007 pase al 0006 y asi sucesivamente, para que no me quede ningun espacio entre id. desde ya muchas gracias. saludos

    ResponderEliminar
  13. Buenas tardes, me podrías apoyar por favor con un programa de aprendiz, no puedo hacer que se ejecute. rodo989@gmail.com

    ResponderEliminar