2012-03-19 9 views
6

¿Es posible posicionar el cursor al comienzo de una línea específica en un archivo a través de RandomAccessFile?Alcanzar una línea específica en un archivo usando RandomAccessFile

Por ej. Quiero cambiar String empezando por char 10 hasta 20 en la línea 111 en un archivo. El archivo tiene registros de longitud fija.

¿Es posible posicionar directamente el cursor al inicio de la línea 111 usando RandomAccessFile?

Actualización:

He utilizado el siguiente código. Sin embargo, está regresando nulo.

Longitud de la línea es de 200 caracteres (que es 200 bytes si no estoy equivocado)

File f = new File(myFile); 
RandomAccessFile r = new RandomAccessFile(f,"rw"); 
r.skipBytes(200 * 99); // linesize * (lineNum - 1) 
System.out.println(r.readLine()); 

Dónde estoy haciendo mal?

Respuesta

3

No estoy seguro, pero parece que RandomAccessFile no es compatible con dicha funcionalidad. Como RAF opera con bytes que puede saltar cantidad específica de bytes, y si su archivo se fija el ancho de línea Esto puede lograrse mediante

file.skipBytes(110 * lineSizeInBytes); 

De lo contrario, se necesita algo como esto:

for (int i = 0; i < 110; i++) file.readLine(); 
String line = file.readLine(); 
+0

Tengo un registro de longitud fija ... déjenme verificar si funciona ... – Nik

+0

Consulte mi pregunta actualizada ... ¿Dónde estoy equivocado? – Nik

+0

Cada línea contiene \ n caracteres. Entonces, de hecho, debe omitir lineCount * (lineSize + 1). – mishadoff

2

No puede hacer esto directamente con RandomAccessFile. Se atiende para trabajar con archivos binarios y le ayuda a leer y escribir ese fragmento de archivos en cualquier ubicación aleatoria que desee. Esta es la razón por la cual la clase se llama RandomAccessFile.

Pero no funciona con textos, por lo que no tiene forma de reconocer el final de línea y no funciona en términos de líneas.

Por lo tanto, para implementar lo que desea, debe usar BufferedReader, leer línea por línea y si desea almacenar posición donde se inicia cada línea, por lo que podrá omitir el número requerido de bytes para saltar al principio de la línea necesaria.

+0

+1, pero el OP comentó tardíamente que el archivo tiene registros de longitud fija. –

+0

@Andrew Thompson, tienes razón. No presté atención a este detalle. – AlexR

+0

No, solo se mencionó * después * de que se publicó su respuesta. Lo edité en la pregunta, para ayudar a evitar una mayor confusión. –

1

Para use RandomAccessFile o necesita tener registros de longitud fija o tener un "vector de dope" de desplazamientos al comienzo de cada registro (o, por ejemplo, cada décimo registro). Estos pueden o no ser apropiados para su problema.

1

Como han dicho otras personas, existen otras clases diseñadas específicamente para leer líneas de texto, como BufferedReader. Sin embargo, si usted está obligado a utilizar RandomAccessFile, se puede leer líneas de texto, pero hay que encontrar mediante programación en la que 1 línea termina y comienza otra línea ...

Un ejemplo sencillo puede ser ...

RandomAccessFile raf = new RandomAccessFile("c:\test.txt","r"); 
String line = ""; 
while (raf.available()){ 
    byte b = raf.read(); 
    if (b == '\n'){ 
    // this is the end of the current line, so prepare to read the next line 
    System.out.println("Read line: " + line); 
    line = ""; 
    } 
    else { 
    line += (char)b; 
    } 
    } 

Esto proporciona el elemento básico para un lector que busca el final de cada línea.

Si tiene la intención de seguir el camino de usar RandomAccessFile, puede comenzar con este marco, pero debe tener en cuenta una serie de inconvenientes y errores tales como ... 1. Uso de Unix y Windows marcadores de línea diferentes: deberá buscar '\ n', '\ r' y una combinación de estos dos 2.Leer un solo byte a la vez es muy lento: debe leer un bloque de bytes en un búfer de matriz (por ejemplo, una matriz de bytes [2048]) y luego iterar a través de la matriz, rellenando la matriz desde RandomAccessFile cuando llegue al final de la matriz de almacenamiento intermedio 3. Si está tratando con caracteres Unicode, necesita leer y procesar 2 bytes a la vez, en lugar de bytes únicos.

RandomAccessFile es muy potente, pero si puede usar algo como BufferedReader, entonces probablemente sea mejor usarlo en su lugar, ya que se ocupa de todos estos problemas automáticamente.

Cuestiones relacionadas