elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  [java] Método modificar sobre datos en un fichero
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [java] Método modificar sobre datos en un fichero  (Leído 3,365 veces)
silk_25

Desconectado Desconectado

Mensajes: 9


Ver Perfil
[java] Método modificar sobre datos en un fichero
« en: 1 Enero 2023, 23:00 pm »

Hola. Estoy haciendo un programa y tengo
Código:
public class Cliente implements Serializable{
    private int id;
    private String nombre;
    private String telefono;
}
Código:
public class Lista implements Serializable{
    private Object [] tabla;
    
    public Lista(){
        tabla=new Object[0];
    }
public Object get(int indice){
        Object obj=null;
        if(indice>=0 && indice<tabla.length){
            obj=tabla[indice];
        }
        return obj;
    }
    
    public int buscar(Object obj){
        int indice=-1;
        for(int i=0; i<tabla.length && indice==-1; i++){
            if(tabla[i].equals(obj)){
                indice=i;
            }
        }
        return indice;
    }

Código:
Principal{
static int opcion;
    static ObjectInputStream ois;
    static ObjectOutputStream oos;
    static Lista listado;
    
    public static void main(String[]args){
        sc=new Scanner(System.in);
        listado=new Lista();
}
public static void update(){
      
        try{
            System.out.print("Id cliente a modificar: ");
            int id=Integer.parseInt(sc.nextLine());

            
            if(id<1 && id>listado.length()){
                System.out.println("No existe cliente con id: "+id);
            }else{
                
                System.out.print("Introduca nombre: ");
                String nombre=sc.nextLine();
              
                System.out.print("Introduzca telefono: ");
                String telefono=sc.nextLine();
                
            }
        }catch(NumberFormatException nfe){
            System.out.println("ERROR. El id debe ser un entero.");
        }
    }
}

Estoy estudiando I/O streams en la parte de ObjectInputStream y ObjectOutputStream. Los métodos de readFile() y writeFile() los tengo y no tengo problemas.
El problema lo tengo en el método de update(), donde tengo que introducir el id del cliente para modificarlo. Si fuese un array normal no habría problema pero el código lo tengo que hacer por medio de la Clase Lista la cual no debo cambiar y de la que he insertado dos métodos. Repito obtenerlo de un array normal no es problema, pero me estoy armando un listo al obtenerlo de listado. En el main tengo un menu que no he insertado ya que creo qeu no hace falta.
Me haría falta un método que recibiese el id y devolviese la posición. Y este método debería estar en la clase Principal.
Espero haberme explicado. Gracias a todos.
Saludos y feliz año.


« Última modificación: 1 Enero 2023, 23:27 pm por silk_25 » En línea

silk_25

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: [java] Método modificar sobre datos en un fichero
« Respuesta #1 en: 11 Febrero 2023, 10:28 am »

Hola, viendo que no consigo respuesta voy a explicarme.
Estoy haciendo el ejercicio "Actividades de aplicación 11.21 del libro Programación de Alfonso Jiménez Marín".
Este ejercicio ya lo tengo resuelto, creo, de otras formas, lo digo porque ahora estoy haciendo otras cosas y no me acuerdo muy bien.
A ver si alguien lo tiene hecho, quizás yo me he complicado y lo estoy haciendo, como forma de estudiar, de otra manera diferente y no es la correcta.
Repito, me falta hacer el método update().
Gracias a todos.
Saludos.



En línea

rub'n


Desconectado Desconectado

Mensajes: 1.217


(e -> λ("live now")); tatuar -> λ("α");


Ver Perfil WWW
Re: [java] Método modificar sobre datos en un fichero
« Respuesta #2 en: 13 Febrero 2023, 21:28 pm »

Hola, viendo que no consigo respuesta voy a explicarme.
Estoy haciendo el ejercicio "Actividades de aplicación 11.21 del libro Programación de Alfonso Jiménez Marín".
Este ejercicio ya lo tengo resuelto, creo, de otras formas, lo digo porque ahora estoy haciendo otras cosas y no me acuerdo muy bien.
A ver si alguien lo tiene hecho, quizás yo me he complicado y lo estoy haciendo, como forma de estudiar, de otra manera diferente y no es la correcta.
Repito, me falta hacer el método update().
Gracias a todos.
Saludos.






Socio, tu tienes un objeto que ira al fichero, veo que eso no lo estas haciendo ahora mismo

De todas maneras coloca lo que llevas ya, estas escribiendo bien en el fichero?

Tu objeto es Cliente y lo puedes escribir con ObjectOutputStream y su metodo writeObject

- Use la jdk 17 para usar records, mejor, para inmutabilidad, la clase una vez compilada es final( para que no se extienda), sin setters y variables de instancia final.
- Use la dependencia lombok, que me permite muchas cosas, una de ellas es la anotación, @Log4j2 ( usada de pekin hasta la china y mas allá)
- Para updatear con ObjectOutputStream, se necesita leer el fichero completo, procesarlo y escribirlo nuevamente. nada eficiente, por eso rara ves se usa.

Código
  1. import java.io.Serializable;
  2.  
  3. public record Customer(int id, String nombre, String telefono) implements Serializable {}

Código
  1. package foro;
  2.  
  3. import lombok.extern.log4j.Log4j2;
  4.  
  5. import java.io.BufferedInputStream;
  6. import java.io.BufferedOutputStream;
  7. import java.io.IOException;
  8. import java.io.ObjectInputStream;
  9. import java.io.ObjectOutputStream;
  10. import java.io.OutputStream;
  11. import java.nio.file.Files;
  12. import java.nio.file.Path;
  13. import java.nio.file.Paths;
  14. import java.util.Arrays;
  15. import java.util.Comparator;
  16. import java.util.List;
  17. import java.util.concurrent.CopyOnWriteArrayList;
  18.  
  19. /**
  20.  * @autor rub'n
  21.  */
  22. @Log4j2
  23. public class ConObjectIOStream {
  24.  
  25.    private static final String RUTA_FICHERO = "./temporal.tmp";
  26.  
  27.    /**
  28.      * Para leer desde el fichero
  29.      *
  30.      * @return List<Customer>
  31.      */
  32.    private List<Customer> findAll() {
  33.        final List<Customer> listaCustomer = new CopyOnWriteArrayList<>();
  34.        final Path pathInput = Paths.get(RUTA_FICHERO);
  35.        if (pathInput.toFile().exists()) {
  36.            try (final BufferedInputStream bin = new BufferedInputStream(Files.newInputStream(pathInput));
  37.                 final ObjectInputStream ob = new ObjectInputStream(bin)) {
  38.  
  39.                while (Boolean.TRUE) {
  40.                    synchronized (ConObjectIOStream.class) { //en caso de que findAll se invoque desde un Thread()
  41.                        final Object object = ob.readObject();
  42.                        if (object instanceof Customer) {
  43.                            listaCustomer.add((Customer) object);
  44.                        }
  45.                    }
  46.                }
  47.                ob.reset();
  48.            } catch (IOException | ClassNotFoundException e) {
  49.            }
  50.        } else {
  51.            log.error("{} - El fichero no existe", pathInput.toFile());
  52.        }
  53.        //Sorted
  54.        return List.copyOf(listaCustomer)
  55.                .stream()
  56.                .distinct() //No repeat Customers
  57.                .sorted(Comparator.comparing(Customer::id))
  58.                .toList();
  59.    }
  60.  
  61.    /**
  62.      * Para escribir en el fichero
  63.      */
  64.    private void save(final Customer... customer) {
  65.        final Path pathTem = Paths.get(RUTA_FICHERO);
  66.        if (!Files.exists(pathTem)) {
  67.            try {
  68.                Files.createFile(pathTem);
  69.            } catch (IOException e) {
  70.                log.error("Error al crear el fichero {}", e);
  71.            }
  72.        }
  73.        try (final OutputStream out = Files.newOutputStream(pathTem);
  74.             final BufferedOutputStream bos = new BufferedOutputStream(out);
  75.             final ObjectOutputStream ob = new ObjectOutputStream(bos)) {
  76.  
  77.            synchronized (ConObjectIOStream.class) {
  78.                Arrays.stream(customer)
  79.                        .forEach((Customer p) -> writeObject(ob, p));
  80.            }
  81.            ob.reset();
  82.        } catch (IOException e) {
  83.            log.error("Error al escribir en fichero {} ", e);
  84.        }
  85.  
  86.        this.showAll();
  87.    }
  88.  
  89.    private void writeObject(final ObjectOutputStream ob, final Customer customer) {
  90.        try {
  91.            ob.writeObject(customer);
  92.        } catch (IOException e) {
  93.            log.error("Error al escribir objecto {} ", e);
  94.        }
  95.    }
  96.  
  97.    private void updateById(final int id, final Customer newCustomer) {
  98.        this.showAll();
  99.  
  100.        final var isCustomerFound = this.findAll()
  101.                .stream()
  102.                .filter(customer -> customer.id() == id)
  103.                .count();
  104.  
  105.        if (isCustomerFound > 0) {
  106.            final var customerList = this.findAll()
  107.                    .stream()
  108.                    .map(customer -> {
  109.                        if (customer.id() == id) {
  110.                            return newCustomer;
  111.                        }
  112.                        return customer;
  113.                    })
  114.                    .toArray(Customer[]::new);
  115.            log.debug("New Customer {}", newCustomer);
  116.            //Save new Customer items
  117.            this.save(customerList);
  118.        } else {
  119.            log.info("Customer id not found! {}", id);
  120.        }
  121.  
  122.    }
  123.  
  124.    /**
  125.      * Show all Customers
  126.      */
  127.    private void showAll() {
  128.        this.findAll()
  129.                .forEach((Customer customer) -> log.info("Customer {}", customer));
  130.    }
  131.  
  132.    public static void main(String[] args) {
  133.  
  134.        final ConObjectIOStream conObjectIOStream = new ConObjectIOStream();
  135.        final Customer customer1 = new Customer(1, "Ana", "001-135452");
  136.        final Customer customer2 = new Customer(2, "Anita", "002-413315");
  137.        final Customer customer3 = new Customer(3, "Bruce Lee", "003-32453");
  138.        final Customer customer4 = new Customer(4, "Carlitos Way", "004-13151");
  139.        final Customer customer5 = new Customer(5, "Zamuray-X", "005-214343");
  140.        final Customer customer6 = new Customer(6, "Inuyasha", "006-014343");
  141.  
  142.        /**
  143.          * Save
  144.          */
  145.        conObjectIOStream.save(customer1, customer2, customer3, customer4, customer5, customer6);
  146.  
  147.        /**
  148.          * show all
  149.          */
  150. //        conObjectIOStream.showAll();
  151.  
  152.        /**
  153.          * updateById
  154.          */
  155. //        final Customer newCustomer = new Customer(5, "Zamuray-X", "005-12345-678");
  156. //        conObjectIOStream.updateById(5, newCustomer);
  157.  
  158.    }
  159.  
  160. }
  161.  
  162. }

Existen 3 métodos ahí

- save(), para guardar los Objetos de tipo cliente en un fichero llamado temporal.tmp
- findAll(), que lee todos los objetos contenidos en el fichero .tmp
- updateById(), que actualiza un Cliente por medio de su id mira la linea 155, donde se le pasa el Objeto cliente nuevo como parametro y su id, si el id existe se actualiza, sino existe no actualiza nada, además

- Estabas usando la clase Scanner usala y creas el objeto con los datos introducidos por teclado.
« Última modificación: 16 Febrero 2023, 18:26 pm por rub'n » En línea



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 ki
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines