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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Ayuda con ObjectOutputStream!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con ObjectOutputStream!  (Leído 4,164 veces)
Ruusa

Desconectado Desconectado

Mensajes: 32


Ver Perfil
Ayuda con ObjectOutputStream!
« en: 30 Agosto 2021, 18:21 pm »

Hola. Buenas tardes, estoy haciendo un ejercicio con persistencia. Y tengo problemas para grabar los objetos en un archivo. Voy agregando los objetos de a uno, ya que tengo un menu. Cuando agrego el primer objeto se lee bien, pero cuando agrego el segundo ya no se lee ninguno. Nose que estoy haciendo mal

Código
  1. public class MiObjectOutputStream extends ObjectOutputStream{ //clase q hereda de objectoutputstream para no sobreescribir la cabecera
  2.  
  3. public void writeStreamHeader() {
  4. //nada
  5. }
  6.  
  7. public MiObjectOutputStream() throws IOException {
  8. super();
  9. }
  10.  
  11. public MiObjectOutputStream (FileOutputStream fileOutputStream) throws IOException {
  12. // TODO Auto-generated constructor stub
  13. super(fileOutputStream);
  14. }
  15.  
  16. }
  17.  
  18.  
  19. //Los metodos guardar y recuperar estan en otra clase
  20.  
  21. public void guardar (Jugador j) throws IOException {
  22. File f= new File("jugador.objeto");
  23. if( f.exists()){
  24. MiObjectOutputStream salida= new MiObjectOutputStream(new FileOutputStream(f));
  25. salida.writeObject(j);
  26. salida.close();
  27. } else {
  28. salida.writeObject(j);
  29. salida.close();
  30. }
  31.  
  32.  
  33. }
  34.  
  35. ObjectInputStream entrada=null;
  36. try{ entrada = new ObjectInputStream(new FileInputStream("jugador.objeto"));
  37.  
  38. while (true) {
  39. Jugador j = ( Jugador) entrada.readObject();
  40. System.out.println(j.getNombre());
  41.  
  42.  
  43.  
  44. }
  45. } catch(IOException io){
  46. } finally {
  47. try {
  48. entrada.close();
  49. } catch (Exception exp) {
  50. }
  51.  
  52.  
  53. }

MOD: Etiqueta GeSHi


« Última modificación: 7 Septiembre 2021, 10:35 am por MCKSys Argentina » En línea

rub'n


Desconectado Desconectado

Mensajes: 1.217


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


Ver Perfil WWW
Re: Ayuda con ObjectOutputStream!
« Respuesta #1 en: 7 Septiembre 2021, 06:28 am »

Usa GeShI


Para escribir objetos de manera binaria con ObjectInput/Output Stream, esta diseñada para escribir solo una vez socio, sino tendrias que reimplemantar una clase tu mismo.


Código
  1. /**
  2.  * @implSpec THREAD-SAFE
  3.  *  @autor rub'n
  4.  */
  5. @Value
  6. @Builder
  7. public class Persona implements Serializable {
  8.    String nombre;
  9.    String apellido;
  10.    String correo;
  11. }

Código
  1. /**
  2.  * @autor rub'n
  3.  */
  4. @Slf4j
  5. public class ConObjectIOStream {
  6.  
  7.    private static final String RUTA_FICHERO = "./temporal.tmp";
  8.  
  9.    private ConObjectIOStream() {
  10.        throw new IllegalAccessError("Constructor privado");
  11.    }
  12.  
  13.    /**
  14.      * Para leer desde el fichero
  15.      *
  16.      * @return List<Persona>
  17.      */
  18.    private static List<Persona> readFromFile() {
  19.        final List<Persona> listaPersona = new CopyOnWriteArrayList<>();
  20.        final Path pathAlimento = Paths.get(RUTA_FICHERO);
  21.        if(pathAlimento.toFile().exists()) {
  22.            try (final BufferedInputStream bin = new BufferedInputStream(Files.newInputStream(pathAlimento));
  23.                 final ObjectInputStream ob = new ObjectInputStream(bin)) {
  24.  
  25.                while (Boolean.TRUE) {
  26.                    synchronized (ConObjectIOStream.class) { //en caso de que readFrom se invoque desde un Thread()
  27.                        final Object object = ob.readObject();
  28.                        if (object instanceof Persona) {
  29.                            listaPersona.add((Persona) object);
  30.                        }
  31.                    }
  32.                }
  33.                ob.reset();
  34.            } catch (IOException | ClassNotFoundException e) {
  35.                //no hacer nada EOFException
  36.                log.error("Error al leer {}", e);
  37.            }
  38.        } else {
  39.            log.error("Error al leer del fichero {}", pathAlimento.toFile());
  40.        }
  41.  
  42.        return List.copyOf(listaPersona)
  43.                .stream()
  44.                .sorted(Comparator.comparing(Persona::getNombre))
  45.                .collect(Collectors.toList());
  46.    }
  47.  
  48.    /**
  49.      * Para escribir en el fichero
  50.      */
  51.    private static void writePersonToTempFile(final Persona ...persona) {
  52.        final Path pathTem = Paths.get(RUTA_FICHERO);
  53.        try (final OutputStream out = Files.newOutputStream(pathTem, StandardOpenOption.CREATE);
  54.             final BufferedOutputStream bos = new BufferedOutputStream(out);
  55.             final ObjectOutputStream ob = new ObjectOutputStream(bos)) {
  56.  
  57.            synchronized (ConObjectIOStream.class) {
  58.                Arrays.stream(persona)
  59.                        .forEach((Persona p) -> writeObject(ob, p));
  60.            }
  61.            ob.reset();
  62.        } catch (IOException e) {
  63.            log.error("Error al escribir en archivo {} ", e);
  64.        }
  65.    }
  66.  
  67.    private static void writeObject(final ObjectOutputStream ob, final Persona persona) {
  68.        try {
  69.            ob.writeObject(persona);
  70.        } catch (IOException e) {
  71.            log.error("Error al escribir objecto {} ", e);
  72.        }
  73.    }
  74.  
  75.    public static void main(String[] args) {
  76.  
  77.        final Persona persona1 = Persona.builder()
  78.                .nombre("ruben")
  79.                .apellido("La muerte")
  80.                .correo("rrara@gmail.com")
  81.                .build();
  82.  
  83.        final Persona persona2 = Persona.builder()
  84.                .nombre("El loco")
  85.                .apellido("La locura")
  86.                .correo("crazyGuy@gmail.com")
  87.                .build();
  88.  
  89.        /*
  90.          * Para escribir
  91.          */
  92.        ConObjectIOStream.writePersonToTempFile(persona1, persona2);
  93.  
  94.        /*
  95.          * Leer
  96.          */
  97.        ConObjectIOStream.readFromFile()
  98.                .forEach((Persona persona) -> log.info("Persona {}", persona));
  99.  
  100.    }
  101.  
  102. }


« Última modificación: 7 Septiembre 2021, 20:57 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