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

Dudas con ficheros de acceso aleatorio

Estas en el tema de Dudas con ficheros de acceso aleatorio en el foro de Java en Foros del Web. Saludos a todos. Este es mi primer post asi que espero no abusar mucho de vuestros conocimientos con mis preguntas de novato =D Antes de ...
  #1 (permalink)  
Antiguo 01/01/2009, 14:06
 
Fecha de Ingreso: enero-2009
Mensajes: 11
Antigüedad: 15 años, 10 meses
Puntos: 0
Sonrisa Dudas con ficheros de acceso aleatorio

Saludos a todos. Este es mi primer post asi que espero no abusar mucho de vuestros conocimientos con mis preguntas de novato =D

Antes de nada, mi interfaz de programación es Netbeans 6.1.

Vereis, estamos haciendo una practica con ficheros de acceso aleatorio (es decir, modificandolo todo dentro del fichero) y programando la lectura de un objeto que ya he introducido previamente mediante escritura me ha entrado esta duda.

¿Como se puede recoger un string de un fichero de acceso aleatorio? Por que no hay ningun metodo "directo" como podria haber a la hora de leer un entero por ejemplo. He intentado comprender los metodos read(int b[], int off, int len) o readFully(int b[], int off, int len) pero no comprendo demasiado bien su mecánica de funcionamiento (sobre todo el int b[])

Ya use google para buscar pero los ejemplos de aplicación son poco...esclarecedores al respecto.

Y antes de que apunteis, en la practica se dice especificamente que NO podemos usar serialización (que seria mas facil por eso querran que no lo usemos :@)

¿Alguna sugerencia al respecto? Gracias por vuestras respuestas =)
  #2 (permalink)  
Antiguo 02/01/2009, 02:47
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Dudas con ficheros de acceso aleatorio

Hola:

Para acceso aleatorio, lo más sencillo es usar la clase RandomAccessFile, que tiene métodos para todo y te permite moverte por el fichero de un sitio a otro.

Si no puedes usarla, los métodos read() que mencionas, leen bytes del fichero. Luego tú tienes que convertirlos a lo que quieras. Por ejemplo, un entero son cuatro bytes, así que para leer un entero, tienes que leer cuatro bytes (un array de 4 bytes) y luego convertir eso a entero.

Otra opción intermedia es usar las "capas" que java tiene para facilitar estas conversiones. Por ejemplo, puedes si estás usando un FileInputStream, puedes construir a partir de él un DataInputStream, que te permite leer enteros

FileInputStream fis = new FileInputStream(....);
DataInputStream dis = new DataInputStream(fis);
int valor = dis.readInt();

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 02/01/2009, 03:24
 
Fecha de Ingreso: enero-2009
Mensajes: 11
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Dudas con ficheros de acceso aleatorio

Hola de nuevo

Gracias por la ayuda chui. Probare tu sugerencia aunque ya consegui hacerlo aunque no leyendo el string en si sino leyendo el objeto.

Es decir:

Código:
String ruta = "ruta del fichero";
RandomAccessFile f_medicamentos = new RandomAccessFile(ruta, "rw");
FileOutputStream flujoSalida = new FileOutputStream(f_medicamentos.getFD());
ObjectOutputStream dataOS = new ObjectOutputStream(flujoSalida);
En un principio parece que no me peta y que escribe de manera correcta, seguramente cambiando output por input deberia de funcionar tambien. Seguire investigando ;)

Gracias por la respuesta (y futuras respuestas con futuras sugerencias =>)
  #4 (permalink)  
Antiguo 02/01/2009, 04:31
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 1 mes
Puntos: 51
Respuesta: Dudas con ficheros de acceso aleatorio

RandomAccessFile tiene un método readUTF() que lee un String y permite leer de una posicion aleatoria en un fichero. Usar Stream, y derivados, no es que esté mal, pero no permite leer de posiciones aleatorias y hay que leer desde el principio del fichero. Si lo vas a hacer así, no hace falta que uses RandomAccessFile para nada.

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 02/01/2009, 05:01
 
Fecha de Ingreso: enero-2009
Mensajes: 11
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Dudas con ficheros de acceso aleatorio

Bueno, escribir ya lo hace sin problemas =)

Lo que hago es simplemente crear el objeto y después empleo los descriptores que mencioné antes para realizar la escritura (que parece que no me lo hace mal) aunque parece que no me introduce salto de lineas (segun deduzco cuando quiero hacer una lectura). Mi codigo de escritura es el siguiente:

Código:
BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in));
**Introduccion de datos del objeto y creacion del objeto**
//Escribimos el objeto en nuestro fichero.
String ruta = "ruta del fichero";
RandomAccessFile f_objetos = new RandomAccessFile(ruta, "rw");
FileOutputStream flujoSalida = new FileOutputStream(f_objetos.getFD());
ObjectOutputStream dataOS = new ObjectOutputStream(flujoSalida);
dataOS.writeObject(m_aux);
dataOS.close();
f_medicamentos.close();
La teoria es que al realizar el dataOS.close() deberia de crearme un fin de linea... ¿o me estoy equivocando? Porque segun muestro las propiedades del objeto en mi metodo de lectura parece que estoy pisoteando mi anterior resultado.

Respecto a la lectura, parece que el metodo readObject asociado al flujo ObjectInputStream funciona sin problema. Eso si, aqui me viene una duda. Imaginemos que hay mas de un objeto en el fichero, ¿este modo seria correcto?

Código:
            
String ruta = "ruta del fichero";
RandomAccessFile f_medicamentos = new RandomAccessFile(ruta, "rw");
FileInputStream flujoEntrada = new FileInputStream(f_objetos.getFD());
ObjectInputStream dataIN = new ObjectInputStream(flujoEntrada);
int n = 0;
while (n < f_medicamentos.length()) {
          Objeto o_aux = (Objeto) dataIN.readObject();
          //Este codigo sirve para saltar al siguiente objeto
          String s_aux = m_aux.toString();
          byte [] b = s_aux.getBytes();
          int l_length = b.length;
          f_objetos.seek(l_length);
          n = n + l_length;
          System.out.println(n);
          }                    
          dataIN.close();
          f_objetos.seek(0);
          f_objetos.close();
Lo que ya no se es si hay alguna funcion asociada a los random access file que nos permita saltar a la linea siguiente una vez leido el objeto. Por eso lo hice a modo "manual" que en teoria deberia de funcionar pero que en la practica solo me muestra el ultimo (aunque puede que sea tambien error de escritura).

¿Alguna sugerencia?
  #6 (permalink)  
Antiguo 02/01/2009, 12:59
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 1 mes
Puntos: 51
Respuesta: Dudas con ficheros de acceso aleatorio

La primera sugerencia sería leer el mensaje que ya escribí .
Lo segundo dejar claro algunos conceptos:
.- Por repetirlo, RandomAccessFile y (Output/Input)Stream son excluyentes. O usas un sistema o usas otro. Los dos no. Si usas los dos a la vez lo unico que conseguiras es que normalmente uno no haga nada, como en el caso de la escritura en que RandomAccessFile no hace absolutamente nada.
.- Los objetos del tipo Stream (Output o Input) són para tratar "bytes", no cadenas. Para tratar cadenas estan los objetos del tipo Reader/Writer, que igualmente son de acceso secuencial pero que tienen en cuenta que lo que guardan es texto y si que hacen cosas como introducir saltos de linea etc.
.- Los ObjectXStream son para almacenar objetos en forma te ristra de bytes, así en genérico, guardando además la definición de la clase de cada objeto en el fichero. No se si es lo que quieres usar o no, pero aquí no hay saltos de linea ni podrás editar el fichero con un editor de tecto, por que guarda bytes, no texto (ver punto anterior).

Mi recomendación sería empezar por un tutorial básico del paquete de entrada salida de Java, que es algo distinto al planteamiento en otros lenguajes, y a mirar el API a menudo, que es la mejor forma de descubrir que cosas se pueden o no hacer con las clases de ese paquete (y de todas claro, pero con estas sin el API se hace mas dificil trabajar).

Algunas referencias por ejemplo aquí:
Muy básica en castellano: http://pisuerga.inf.ubu.es/lsi/Inves...Tuto/III_3.htm
Más completo en inglés (los dos primeros temas): http://java.sun.com/docs/books/tutorial/essential/io/

El API de Java I/O más actual: http://java.sun.com/javase/6/docs/api/java/io/

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #7 (permalink)  
Antiguo 03/01/2009, 13:35
 
Fecha de Ingreso: enero-2009
Mensajes: 11
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Dudas con ficheros de acceso aleatorio

Gracias, ya consegui realizar la lectura y escritura. Usando las ordenes propuestas por Greeneyed y tras revisar el api de java lo tengo dominado.

Se agradece la ayuda. Podeis cerrar tema si quereis ^^
  #8 (permalink)  
Antiguo 28/11/2010, 20:48
 
Fecha de Ingreso: noviembre-2010
Mensajes: 1
Antigüedad: 14 años
Puntos: 0
Pregunta Respuesta: Dudas con ficheros de acceso aleatorio

Cita:
Iniciado por garan Ver Mensaje
Gracias, ya consegui realizar la lectura y escritura. Usando las ordenes propuestas por Greeneyed y tras revisar el api de java lo tengo dominado.

Se agradece la ayuda. Podeis cerrar tema si quereis ^^
ahora necesito saber por favor como cambio un lugar especifico de un archivo es decir un string dentro del fichero

o un grupo de strings de diferentes dimensiones creadas en un archivo:

cadena1 dentro del archivo, small
cadena2 dentro del archivo, pequeña
cadena3 dentro del archivo, la mediana
cadena4 dentro del archivo, la mas grande
cadena5 dentro del archivo, la normal

y asi sucesivamente... solo quiero cambiar un string...
me urge tan tan pronto como sea posible

Última edición por TJ23; 28/11/2010 a las 20:53 Razón: caligrafia
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 14:00.