Test Foro de elhacker.net SMF 2.1

Programación => Programación General => Java => Mensaje iniciado por: ryhuso en 17 Abril 2020, 13:31 PM

Título: Modificar fichero en java
Publicado por: 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.

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 .
Título: Re: Modificar fichero en java
Publicado por: rub'n en 17 Abril 2020, 13:35 PM
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.
Título: Re: Modificar fichero en java
Publicado por: @XSStringManolo en 17 Abril 2020, 14:19 PM
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");

Título: Re: Modificar fichero en java
Publicado por: ryhuso en 17 Abril 2020, 14:23 PM
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);
        }
    }
]
Título: Re: Modificar fichero en java
Publicado por: rub'n en 17 Abril 2020, 15:16 PM
bien como es el Objeto Abonado ?

También se podría escribir en forma de objeto Serializado.
Título: Re: Modificar fichero en java
Publicado por: ryhuso en 17 Abril 2020, 15:30 PM
el objeto abonado son 3 cadenas
telefono
nombre
factura
Título: Re: Modificar fichero en java
Publicado por: rub'n en 17 Abril 2020, 18:09 PM
Cita de: ryhuso en 17 Abril 2020, 15:30 PM
el objeto abonado son 3 cadenas
telefono
nombre
factura



>: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();


   }
}


Título: Re: Modificar fichero en java
Publicado por: ryhuso en 7 Mayo 2020, 15:28 PM
Gracias por la ayuda.. :laugh: