Modificar fichero en java

Iniciado por ryhuso, 17 Abril 2020, 13:31 PM

0 Miembros y 2 Visitantes están viendo este tema.

ryhuso

Hola mi problema es que necesito modificar un fichero en java pero no se como hacerlo
busque por la web y no encontre ejemplos claros.

lo que tengo que hacer es que en un fichero que tengo creado de una agenda modificarle el numero de telefono.

public void altaFactura(Abonado nueva) {
        try {
            File f = new File("facturas_telf.dat");
            FileWriter fw;
            BufferedWriter bw;
            if (f.exists()) {
                fw = new FileWriter(f, true);
                bw = new BufferedWriter(fw);
                bw.newLine();
                bw.write(nueva.numeroAbonado + "%" + nueva.nombre + "%" + nueva.factura);
            } else {
                fw = new FileWriter(f);
                bw = new BufferedWriter(fw);
                bw.write(nueva.numeroAbonado + "%" + nueva.nombre + "%" + nueva.factura);
            }
            bw.close();
            fw.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }



lo que quiero es buscar un numero de telefono numeroAbonado en este caso y cambiar el numero o nombre .... modificarlo .

rub'n

Cita de: ryhuso en 17 Abril 2020, 13:31 PM
Hola mi problema es que necesito modificar un fichero en java pero no se como hacerlo
busque por la web y no encontre ejemplos claros.

lo que tengo que hacer es que en un fichero que tengo creado de una agenda modificarle el numero de telefono.

Bueno, y como hiciste el fichero? muestra a ver que tal. parte del código, y se mas descriptivo.

Usa GeSHi si vas a copiar código java.


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

@XSStringManolo

Hay muchas formas distinas de hacer lo mismo, según el tipo de archivo, tamaño, permisos, frecuencia de escritura...

Por la info que das...

Supongo que quieres hacer algo así:
Código (java) [Seleccionar]
String contactos = FileUtils.readFileToString(new File("Contactos.vcf"), "UTF-8");
contactos = contactos.replaceAll("671718181", "653717272");
File contactosM = new File("ContactosModificados.vcf");
FileUtils.writeStringToFile(contactosM, contactos, "UTF-8");


ryhuso

Cita de: rub'n en 17 Abril 2020, 13:35 PM
Bueno, y como hiciste el fichero? muestra a ver que tal. parte del código, y se mas descriptivo.

Usa GeSHi si vas a copiar código java.

[ public void altaFactura(Abonado nueva) {
        try {
            File f = new File("facturas_telf.dat");
            FileWriter fw;
            BufferedWriter bw;
            if (f.exists()) {
                fw = new FileWriter(f, true);
                bw = new BufferedWriter(fw);
                bw.newLine();
                bw.write(nueva.numeroAbonado + "%" + nueva.nombre + "%" + nueva.factura);
            } else {
                fw = new FileWriter(f);
                bw = new BufferedWriter(fw);
                bw.write(nueva.numeroAbonado + "%" + nueva.nombre + "%" + nueva.factura);
            }
            bw.close();
            fw.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
]

rub'n

#4
bien como es el Objeto Abonado ?

También se podría escribir en forma de objeto Serializado.


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

ryhuso

el objeto abonado son 3 cadenas
telefono
nombre
factura

rub'n

#6
Cita de: ryhuso en 17 Abril 2020, 15:30 PM
el objeto abonado son 3 cadenas
telefono
nombre
factura



  • Para no hardcodear la ruta mejor busca el fichero con un JFileChooser
  • Para reemplazar invoca a reemplazarNumero(), con dos parámetros String viejo y el String nuevo

>:D Si quieres pruebalo.


Ejemplo bean Abonado

Código (java) [Seleccionar]
/**
* @implSpec NO-THREAD-SAFE
*/
public class Abonado {

   private String nombre;
   private String telefono;
   private String factura;

   public String getNombre() {
       return nombre;
   }

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

   public String getTelefono() {
       return telefono;
   }

   public void setTelefono(String telefono) {
       this.telefono = telefono;
   }

   public String getFactura() {
       return factura;
   }

   public void setFactura(String factura) {
       this.factura = factura;
   }

   @Override
   public String toString() {
       return "Abonado{" +
               "nombre='" + nombre + '\'' +
               ", telefono='" + telefono + '\'' +
               ", factura='" + factura + '\'' +
               '}';
   }
}


Código (java) [Seleccionar]
import javax.swing.*;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Collectors;

/**
*
*/
public class FacturasTelf {

   private Path rutaFichero;

   public FacturasTelf() {

       final Abonado abonado = new Abonado();
       abonado.setNombre("gas");
       abonado.setFactura("lus DeboSiempre");
       abonado.setTelefono("3999 999 050");

       //Buscar Fichero no hardcoded
       if(buscarFichero()) {
           //Escritura normal objeto
           //this.altaFactura(abonado);

           //Invocar para reemplazar viejo numero telefonico Basico
           //Puedes invocarlo por medio de un listerner
           this.reemplazarNumero("3999 111 222" , "3999 111 111");
       }

   }

   public boolean buscarFichero() {
       final JFileChooser jFileChooser = new JFileChooser();
       jFileChooser.setDialogType(JFileChooser.FILES_ONLY);
       jFileChooser.setDialogTitle("Abrir Fichero");
       final int opc = jFileChooser.showOpenDialog(null);
       boolean value = false;
       if(opc == JFileChooser.OPEN_DIALOG) {
           rutaFichero = jFileChooser.getSelectedFile().toPath();
           value = Boolean.TRUE;
       } else {
           JOptionPane.showMessageDialog(null, "Fichero sin seleccionar");
       }
       return value;
   }



   /**
    *
    * @param nueva
    */
   public void altaFactura(Abonado nueva) {

       try (final FileWriter fw = new FileWriter(rutaFichero.toFile(), true);
            final BufferedWriter bw = new BufferedWriter(fw)) {

           if (rutaFichero.toFile().exists()) {
               //Para reemplazar numero

               bw.newLine();
               bw.write(nueva.getTelefono() + "%" + nueva.getNombre() + "%" + nueva.getFactura());


           } else { //No ejecuta, new File() lo crea por defecto
               //fw = new FileWriter(f);
               //bw = new BufferedWriter(fw);

               bw.write(nueva.getTelefono() + "%" + nueva.getNombre() + "%" + nueva.getFactura());
           }
       } catch (IOException e) {
           System.out.println(e);
       }
   }


   /**
    * Metodo usado para reemplazar el viejo numero
    *
    * @param viejo
    * @param numeroReemplazar
    */
   public void reemplazarNumero(final String viejo, final String numeroReemplazar) {

       final StringBuilder sb = new StringBuilder();
       String nuevaData = "";

       try (final BufferedReader reader = new BufferedReader(Files.newBufferedReader(rutaFichero))) {

           sb.append( reader
                   .lines()
                   .collect(Collectors.joining( System.lineSeparator() )));

           nuevaData = sb.toString().replaceAll(viejo, numeroReemplazar );

       } catch(IOException e) {
           //mejor un logger
           e.printStackTrace();
       }

       /**
        *  Nuevamente escribimos el fichero
        */
       try (final BufferedWriter writer = new BufferedWriter(Files.newBufferedWriter(rutaFichero))) {

           writer.write(nuevaData);
           writer.write(System.lineSeparator()); //separador del sistema
           JOptionPane.showMessageDialog(null, "Reemplazo listo");

       } catch(IOException e) {
           //mejor un logger
           e.printStackTrace();
       }

   }

   public static void main(String ...blablla) {
       new FacturasTelf();
   }
}





Aunque prefiero los DSL por ejemplo algo simple

Código (java) [Seleccionar]

        final Abonado abonado = new Abonado();
       abonado.setNombre("Factura Telefono N#2144141");
       abonado.setFactura("lus DeboSiempre");
       abonado.setTelefono("3999 999 050");


        /**
        * Para escribir en un fichero ejemplo
        */
      new IFacturar.FacturaImpl()
              .buscarFichero()
              .escribirFichero(abonado) //toString()
              .make();

       /**
        * Para reemplazar String en un fichero, no tan eficiente, mejor RandomAccessFile
        */
       new IFacturar.FacturaImpl()
               .guardarFichero()
               .reemplazar(e -> e.replaceAll("3999 999 050", "3999 000 000"))//con expresión lambda de una vez.
               .make();


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

import javax.swing.*;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.Objects;
import java.util.function.UnaryOperator;
import java.util.logging.Logger;

/**
* DSL simple.
*/
public interface IFacturar {

   /**
    * @param <T>
    */
   interface Builder<T> {

       default Builder<T> buscarFichero() {
           return this;
       }

       default Builder<T> guardarFichero() {
           return this;
       }

       Builder<T> altaFactura(Abonado nueva);

       Builder<T> reemplazar(final UnaryOperator<String> unaryOperator);

       <T> Builder<T> escribirFichero(final T t);

       T make();

   }

   @SuppressWarnings("unchecked")
   abstract class AbstractBaseClassFactura<S> implements Builder<S> {

       private Path rutaFichero;
       private String nuevaData = "";
       private static final Logger LOG = Logger.getLogger(AbstractBaseClassFactura.class.getSimpleName());

       public AbstractBaseClassFactura() {

       }

       @Override
       public Builder<S> buscarFichero() {
           jFileChooserBuscar();
           return this;
       }

       private void jFileChooserBuscar() {
           final JFileChooser jFileChooser = new JFileChooser();
           jFileChooser.setDialogType(JFileChooser.FILES_ONLY);
           jFileChooser.setDialogTitle("Abrir Fichero");
           final int opc = jFileChooser.showOpenDialog(null);
           if (opc == JFileChooser.OPEN_DIALOG) {
               this.rutaFichero = jFileChooser.getSelectedFile().toPath();
           }
       }

       @Override
       public Builder<S> guardarFichero() {
           jFileChooserGuardar();
           return this;
       }

       private void jFileChooserGuardar() {
           final JFileChooser jFileChooser = new JFileChooser();
           jFileChooser.setDialogType(JFileChooser.DIRECTORIES_ONLY);
           jFileChooser.setDialogTitle("Guardar Fichero");
           final int opc = jFileChooser.showSaveDialog(null);
           if (opc == JFileChooser.APPROVE_OPTION) {
               this.rutaFichero = jFileChooser.getSelectedFile().toPath();
           }
       }

       /**
        * @param nueva
        */
       public Builder<S> altaFactura(Abonado nueva) {
           try (final FileWriter fw = new FileWriter(rutaFichero.toFile(), true);
                final BufferedWriter bw = new BufferedWriter(fw)) {

               if (rutaFichero.toFile().exists()) {
                   bw.newLine();
                   bw.write(nueva.getTelefono() + "%" + nueva.getNombre() + "%" + nueva.getFactura());
                   JOptionPane.showMessageDialog(null, "Fichero escrito correctamente!");

               }
           } catch (IOException e) {
               LOG.warning(e.getMessage());
           }
           return this;
       }

       /**
        * Con UnaryOperator para reemplazar el numero por medio de expresion lambda
        *
        * @param unaryOperator
        * @return Builder<S>
        */
       public Builder<S> reemplazar(final UnaryOperator<String> unaryOperator) {
           Objects.requireNonNull(rutaFichero, () -> "ruta destino es nula");
           Path destino = rutaFichero;
           final long id = System.currentTimeMillis();
           //tomar extension
           final String ext = destino.getFileName().toString().substring(destino.getFileName().toString().lastIndexOf("."));
           final String fileName = destino.getFileName().toString().replace(ext, id +"reemplazado"+ ext);
           destino = destino.resolveSibling(fileName);

           try (final BufferedReader reader = new BufferedReader(Files.newBufferedReader(rutaFichero));
                final BufferedWriter wr = new BufferedWriter(Files.newBufferedWriter(destino, StandardOpenOption.CREATE))) {
               reader.lines()
                       .map(unaryOperator)
                       .forEach(e -> {
                           try {
                               wr.write(e);
                               wr.write(System.lineSeparator());
                           } catch (IOException ex) {
                               ex.printStackTrace();
                           }
                       });
               JOptionPane.showMessageDialog(null, "Reemplazo listo!");
           } catch (IOException e) {
               LOG.warning(e.getMessage());
           }
           return this;
       }

       /**
        * Escritura de fichero
        */
       @SuppressWarnings("unchecked")
       public <O> Builder<O> escribirFichero(O abonado) {
           Objects.requireNonNull(rutaFichero,"ruta de fichero es nula");
           try (final BufferedWriter writer = new BufferedWriter(Files.newBufferedWriter(rutaFichero))) {

               writer.write(abonado.toString());
               writer.write(System.lineSeparator()); //separador del sistema
               JOptionPane.showMessageDialog(null, "Escritura Lista!");

           } catch (IOException e) {
               LOG.warning(e.getMessage());
           }
           return (Builder<O>) this;
       }
   }

   /**
    *
    */
   class FacturaImpl extends AbstractBaseClassFactura<FacturaImpl> {

       @Override
       public FacturaImpl make() {
           return new FacturaImpl();
       }

   }

   public static void main(String... blablla) {

       final Abonado abonado = new Abonado();
       abonado.setNombre("Factura Telefono N#2144141");
       abonado.setFactura("lus DeboSiempre");
       abonado.setTelefono("3999 999 050");

       /**
        * Para escribir en un fichero ejemplo
        */
      /*new IFacturar.FacturaImpl()
              .buscarFichero()
              .escribirFichero(abonado) //toString()
              .make();*/

       /**
        * Para reemplazar String en un fichero, no tan eficiente, mejor RandomAccessFile
        */
       new IFacturar.FacturaImpl()
               .guardarFichero()
               .reemplazar(e -> e.replaceAll("3999 999 050", "3999 000 000"))//con expresión lambda de una vez.
               .make();


   }
}




rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

ryhuso