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

Duda: java.IO.EOFException

Estas en el tema de Duda: java.IO.EOFException en el foro de Java en Foros del Web. Saludos compañeros. Antes de plantearos miduda apuntar que mi entorno de programación es netbeans 6.1. Vereis, he construido el siguiente codigo que lo que hace ...
  #1 (permalink)  
Antiguo 03/01/2009, 13:44
 
Fecha de Ingreso: enero-2009
Mensajes: 11
Antigüedad: 15 años, 4 meses
Puntos: 0
Sonrisa Duda: java.IO.EOFException

Saludos compañeros. Antes de plantearos miduda apuntar que mi entorno de programación es netbeans 6.1.

Vereis, he construido el siguiente codigo que lo que hace es ordenar un vector de enteros según el orden alfabetico de las lineas de un fichero de acceso aleatorio para asi poder mostrar las lineas en orden "alfabetico" sin usar estructuras como vectores.

Código:
public Vector Ordenar_NombreGA(RandomAccessFile f, Vector v) throws IOException {
        f.seek(0);
        for (int i = 0; i < v.size(); i++) {
            for (int j = 0; i < v.size() - 1; j++) {
                this.Situar_Puntero(i);
                long numero1 = this.getPl();
                this.Situar_Puntero(j);
                long numero2= this.getPl();
                f.seek(numero1);
                String s1 = f.readUTF();
                f.seek(numero2);
                String s2 = f.readUTF();
                if (s1.compareToIgnoreCase(s2) > 0) {
                    this.intercambiar(v, j, j + 1);
                }
            }
        }
        f.close();
        return v;
    }
Bueno, como podreis ver es el clasico algoritmo burbuja para ordenar retocado para mi caso. Situar_puntero es una funciona que devuelve la posicion del puntero donde empieza (en nuestro fichero) el numero de linea especificada.

Ahora bien, aunque la ordenacion me la hace correctamente (es decir, visualizo mi vector y realiza la ordenacion de manera correcta) me salta una excepción que no se situarla en el contexto

Código:
Exception in thread "main" java.io.EOFException
        at java.io.RandomAccessFile.readFully(RandomAccessFile.java:383)
        at java.io.DataInputStream.readUTF(DataInputStream.java:592)
        at java.io.RandomAccessFile.readUTF(RandomAccessFile.java:887)
        at farmacia.Manipulador.Ordenar_NombreGA(Manipulador.java:113)
Según he googleado por ahi, esa excepción salta cuando has llegado al final de un stream e intentas seguir leyendo. Por eso me escama ya que f.readUTF() deberia tener contemplada esa posibilidad... ¿no?

Gracias por las futuras ayudas =)
  #2 (permalink)  
Antiguo 03/01/2009, 15:31
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Duda: java.IO.EOFException

Eso quiere decir que has hecho un readUTF() con el "puntero" en el final del fichero. Se supone que en un fichero de acceso aleatorio tu tienes que saber donde acaba el fichero y no leer más alla del final, y por eso da una excepción. En los Streams no da error "leer hasta el final" por que es el funcionamiento normal para leer de un Stream.

Por cierto, no se si es un por un ejercicio o por aprender, que no tiene nada de malo, pero si no, Java ya implementa algoritmos de ordenación de vectores, así que no hace falta que los implementes tu mismo.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #3 (permalink)  
Antiguo 04/01/2009, 05:10
 
Fecha de Ingreso: enero-2009
Mensajes: 11
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Duda: java.IO.EOFException

Cita:
Iniciado por GreenEyed Ver Mensaje
Eso quiere decir que has hecho un readUTF() con el "puntero" en el final del fichero. Se supone que en un fichero de acceso aleatorio tu tienes que saber donde acaba el fichero y no leer más alla del final, y por eso da una excepción. En los Streams no da error "leer hasta el final" por que es el funcionamiento normal para leer de un Stream.

Por cierto, no se si es un por un ejercicio o por aprender, que no tiene nada de malo, pero si no, Java ya implementa algoritmos de ordenación de vectores, así que no hace falta que los implementes tu mismo.

S!
Es por un ejercicio :p

Volviendo al tema, hay una cosa que has dicho y que me ha sorprendido (lo marcado en negrita). En mi codigo yo situo el puntero antes de realizar la lectura del string por lo que no tendria mucho sentido que ahora el f.seek(long) hiciera lo que le salga de las narices xD

Para comprender mejor lo que quiero hacer pondre un ejemplo:

Imaginad la siguiente estructura de fichero:

Código:
pedro madrid 87
maria  barcelona 46
alberto badajoz 24
martin asturias 23
Previamente mi programa ya ha construido un vector con el numero de lineas (en este caso 4 lineas por lo que el vector seria [1,2,3,4].
Si quiero mostrar ordenando alfabeticamente sin emplear vectores, mi programa lo que hace es el algoritmo de la burbuja comparando los nombres (es decir, compara pedro con maria, con alberto, etc...) y ordenar vector de tal manera que el orden sea las lineas alfabeticamente.
En este ejemplo quedaria [3,2,4,1]

Luego yo con otra funcion, accederia al puntero referenciado por la linea y mostraria las lineas segun el criterio del vector.

Espero haberme explicado :P
  #4 (permalink)  
Antiguo 04/01/2009, 07:05
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Duda: java.IO.EOFException

Un error de java.io.EOFException no se lanza cuando estas trabajando con vectores/arrays, se lanza al intentar escribir/leer de un fichero. Así que o salta cuando estas leyendo del fichero, o salta cuanto estas escribiendo de vuelta en el fichero, pero no mientras ordenas un array.

De hecho, si miras el stack trace te dice en que linea saltó el error: Manipulador.java, linea 113 y que estabas haciendo en esa linea: readUTF(RandomAccessFile.java:887). Así que el error es por llamar a readUTF() en esa linea, no por nada del array.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #5 (permalink)  
Antiguo 04/01/2009, 09:40
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Duda: java.IO.EOFException

Hola:

UTF es un formato especial para cadenas de texto. Si NO has guardardo el fichero escribiendo con writeUTF(), no puedes leerlo con readUTF().

Una cadena UTF contiene al principio una entero (4 bytes) indicando cuantos caracteres tiene la cadena. Si el fichero lo escribes con un editor, no puedes leerlo con readUTF(). Lo más probable es que los cuatro primeros bytes de tu fichero (los cuatro bytes de "pedr" en la palabra "pedro") representen un entero muy grande (por ejemplo, 45738) y cuando readUTF() intenta leer todos esos caracteres, no los hay, dando el error de fin de fichero.

Si no has escrito con writeUTF(), usar readLine() para leer y luego separa (con el método split() de String) los tres cachos de cada línea.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
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 00:25.