Foros del Web » Programación para mayores de 30 ;) » Java »

eliminar un objeto de un fichero binario

Estas en el tema de eliminar un objeto de un fichero binario en el foro de Java en Foros del Web. Hola, tengo una parte en mi programa en la que introduzco objetos en un fichero binario, pero necesito también eliminarlos en otra parte del programa, ...
  #1 (permalink)  
Antiguo 12/05/2014, 13:11
Avatar de floppy-dj  
Fecha de Ingreso: diciembre-2006
Ubicación: Huelva
Mensajes: 25
Antigüedad: 17 años, 4 meses
Puntos: 0
eliminar un objeto de un fichero binario

Hola, tengo una parte en mi programa en la que introduzco objetos en un fichero binario, pero necesito también eliminarlos en otra parte del programa, lo que hice fue guardar en un array todos los objetos que quería que no se borraran, y luego hacia:

Código:
ObjectOutputStream salida = new ObjectOutputStream(new FileOutputStream(fichero + ".obj"));
         
         
         for (int i = 0; i < c_p.size(); i++) {
         salida.writeObject(c_p.get(i));
         }
         salida.close();
Pero haciendo esto me da la siguiente excepcion:

java.io.StreamCorruptedException: invalid stream header: 7371007E

Gracias de antemano.

Última edición por floppy-dj; 12/05/2014 a las 14:05
  #2 (permalink)  
Antiguo 12/05/2014, 14:52
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: eliminar un objeto de un fichero binario

Hola:

Un StreamCorruptedException da al leer un ObjectInputStream, no al escribir, imagino que la excepción no te salta en ese trozo de código, sino cuando intentas leer luego el fichero escrito.

El posible motivo es el siguiente.

Cada vez que haces un new ObjectOutputStream(...), se envía automáticamente una cabecera de bytes. Luego puedes escribir objetos en ese ObjectOutputStream y el contenido de tu fichero será cabecera de bytes + objetos.

Cuando hacdes un new ObjetctInputStream(...) se intenta leer una cabecera de bytes escrita por un ObjectOutputStream. Luego puedes leer objetos, tantos como hayas escrito.

El problema se presenta si cuando se espera leer una cabecera de bytes no se encuentra y esto sucede si el número de new ObjectOutputStream o el sitio donde se hacen en la secuencia de escritura de ficheros, es distinto que el número de new ObjectInputStream o la secuencia en que se hace.

En tu ejemplo, si has escrito como muestras, debes leer haciendo un new ObjectInputStream y usando ese mismo ObjectInputStream para leer todos los objetos en un bucle, es decir, la misma secuencia que has hecho al escribir.

Tienes la explicación más detallada aquí http://www.chuidiang.com/java/ficher...tosFichero.php

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 12/05/2014, 14:58
Avatar de floppy-dj  
Fecha de Ingreso: diciembre-2006
Ubicación: Huelva
Mensajes: 25
Antigüedad: 17 años, 4 meses
Puntos: 0
Respuesta: eliminar un objeto de un fichero binario

si, todo lo que me dijiste lo sabia, y el código esta usando un solo new, en la escritura como en la lectura, de hecho ya había leído ese enlace que pasaste y por eso consigo hacerlo que funcione si comento este trozo que muestro, osea puedo recoger los objetos y usarlos, pero claro lo que quiero es borrarlos una vez que los saco y no se donde me estoy equivocando.
  #4 (permalink)  
Antiguo 13/05/2014, 01:01
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: eliminar un objeto de un fichero binario

En un fichero no se puede borrar registros intermedios. Entiendo que lo que has hecho es leerlo todo en memoria, borrar lo que quieres y luego volver a escribir lo que queda en un fichero nuevo (o el mismo machacando).

Si abres ese nuevo fichero para lectura desde cero, no deberías tener problemas. Si aun así los tienes, pon también el código de lectura para ver si hay algo raro.

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Etiquetas: binario, fichero, objeto, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:15.