Problema Ficheros Java

T

Veréis, estoy haciendo una practica del tipico videoclub, que tienes que dar de alta peliculas y tal. En un ejercicio me dice que tengo que dar de baja una pelicula, pero ni idea de como hacerlo.

Lo que he pensado es:

  
public void baja(String nombre){ nombre = Utilidades.resize(nombre,10); this.to_begin(); //Va al principio while(!this.eof()){ //Mientras que no sea el final this.reg.read(this.raf); //Lee el registro if(this.reg.get_activo()==true){ //Si está activo if(nombre.equals(this.reg.get_Nombre())==true){ //Si encuentra el nombre reg.set_activo(false); //Pasa a estar inactivo } } } }

Basicamente en 'reg', que es una clase para registrar las películas, hay un Display que muestra las peliculas si tienen el campo 'activo' en true. De esta manera en teoria lo pasa a false y no se mostraria, pero el display lo sigue mostrando, o sea que no sé, me estoy volviendo loco.

El display es tal que:

  public void display(){
    if(this.activo==true){ //Si esta activo
      System.out.println("Nombre: "+this.Nombre+"\tGenero: "+this.Genero+"\tFecha: "+this.Fecha+
      "         \tCodigo: "+this.Codigo);
    }
  }

Ayuda, estoy sufriendo xD

T

Durante unas horas seriáis mis héroes si me echarais una manilla, yo ya no se que intentar :(

Si alguien ha leido el codigo y no ha entendido demasiado yo lo explico, lo que sea, me arrodillo y todo.

Thanat0s

#1 Lo primero de todo, recomendarte que no uses los ==true sabiendo que algo ya te devuelve true o false porque queda muy feo

if(this.reg.get_activo()){                  //Si está activo
        if(nombre.equals(this.reg.get_Nombre())){ //Si encuentra el nombre
            reg.set_activo(false);                      //Pasa a estar inactivo
        }
      }

Pastea el código del set_activo a ver qué es lo que haces ahí, porque por lo demás todo parece estar bien.

pd: ¿estás usando ficheros? Si es así, lo que falla es que no guardas la modificación en el fichero o al menos no inmediatamente después de cambiar el set_activo a false.

1 1 respuesta
T

#3
Set_activo

  public void set_activo(boolean activo){
    this.activo=activo;
  }

Para escribir los datos utilizo

  public void write(RandomAccessFile raf){
    try{
      raf.writeBoolean(this.activo);
      raf.writeBytes(this.Nombre);
      raf.writeBytes(this.Genero);
      raf.writeBytes(this.Fecha);
      raf.writeBytes(this.Codigo);
    }catch(IOException e){System.out.println(e);}
  }

Pero claro, imagino que el fallo viene de ahí, que tendría que borrar el contenido de 'activo' que estuviera para pasarlo a false, que follón. Gracias ;D

Y un saludo desde aquí a esos profesores del DAI que se pasan la ultima evaluación moneando para poner estas cosas en los exámenes sin haberlas explicado, sois majisimos.

1 respuesta
Thanat0s

#4 Si quieres una forma sencilla de hacerlo, sería recorrer el fichero que original y mientras lo vas copiando a un archivo auxiliar, cuando llegas al registro que quieres modificar, copias los nuevos datos en el archivo auxiliar y pasas de lo que tengas en el original y luego sigues copiando los registros hasta final de fichero.
Al final borras el original y cambias el nombre al otro para que tenga el del original.

La forma que tú dices sería lo más correcto, tampoco he trabajado mucho con archivos en java, simplemente me limitaba a copiar estructuras de datos serializadas y era todo mucho más sencillo.

Saludos y suerte! :)

1 respuesta
Khanser

usa lo de #5. Es lo más sencillo.

Tienes una lista de peliculas y haces para guardar.

ObjectOutputStream salida=new ObjectOutputStream(new FileOutputStream("videoclubFile"));
salida.writeObject(lista);

Cuando quieras darlo de baja, haces ObjectInputStream entrada=new ObjectInputStream(new FileInputStream("videoclubFile"));
entrada.readObject();

(si has guardado varios, haz readobject hasta que te devuelva null o te de una excepción)

Borras la peli de ese objeto recuperado y vuelves a guardar.

FIN :)

1 respuesta
T

#6 Uf xD

Si, algo asi estoy viendo por google. Pero es que esto del ObjectOutputStream, aunque mas o menos sepa usarlo, en clase no se ha dado. Usamos el RandomAccessFile y demás, y claro, todo tenemos que hacerlo con eso.

Aun así gracias, voy a ver como me las ingenio, menudo montón de mierda.

T

Bueno, ya ha pasado el examen (solo he sacado un 10, pse) y la solución es la siguiente, no me pregunteis porqué, pero funciona; así que si alguien en un futuro encuentra este thread o para los que me han ayudado y quieran ver como termina el asunto ahí va.

    public void baja(int precio){
        this.to_begin();
        while(!this.eof()){
          this.reg.read(this.raf);
          if(this.reg.get_activo()){
            if(this.reg.get_Precio()<precio){
              this.reg.set_activo(false);
            }
            reg.display();
          }
        }
      

Diferencia? Llamar al display dentro de la funcion. Bueno, eso y que ahora en vez de Strings funciona con Int, pero en esencia es igual.

Usuarios habituales

  • Talbain
  • Khanser
  • Thanat0s