2012-02-08 19 views
7

Estoy analizando un archivo .cvs. Para cada línea de los cvs, creo un objeto con los valores analizados y los pongo en un conjunto.Java BufferedReader compruebe las líneas siguientes de un bucle antes de realizar un bucle

Antes de colocar el objeto en el mapa y pasarlo al siguiente, necesito verificar si la línea del siguiente cvs es el mismo objeto que el real, pero con un valor de propiedad particular diferente.

Para eso, necesito comprobar las siguientes líneas del búfer, pero mantener el búfer del bucle en la misma posición.

Por ejemplo:

BufferedReader input = new BufferedReader(new InputStreamReader(new FileInputStream(file),"ISO-8859-1")); 
String line = null; 

while ((line = input.readLine()) != null) { 
    do something 

    while ((nextline = input.readLine()) != null) { //now I have to check the next lines 
     //I do something with the next lines. and then break. 
    } 
    do something else and continue the first loop. 
} 
+1

'BufferedReader()' tiene métodos 'mark()' y 'reset()' que pueden ayudarlo (nunca los he usado, por eso no los publico como respuesta). – hmjd

+0

¿Cuál es el problema real? –

+2

¿Puede simplemente llamar a input.mark() sin pasar ningún parámetro? –

Respuesta

8
  1. Puede marcar la posición actual usando BufferedReader.mark(int). Para regresar a la posición, llame al BufferedReader.reset(). El parámetro mark es el "límite de lectura anticipada"; Si intenta reset() después de leer más del límite, puede obtener una IOException.

  2. O usted podría utilizar en lugar RandomAccessFile:

    // Get current position 
    long pos = raf.getFilePointer(); 
    // read more lines... 
    // Return to old position 
    raf.seek(pos); 
    
  3. O usted podría utilizar PushbackReader que le permite unread caracteres. Pero existe la desventaja: PushbackReader no proporciona un método readLine.

+3

¿Cómo puedo usar el método input.mark()? Quiero decir. Necesito pasar un parámetro (supongo que es la posición que quiero marcar), pero ¿cómo lo recupero, ya que estoy leyendo líneas? –

+0

Marca la posición actual. No hay forma de recuperarlo, solo puede pedirle a la transmisión que regrese amablemente a la posición que marcó anteriormente. El parámetro determina qué tan lejos puede leer antes de que la marca se invalide. Si vas más lejos, es posible que no puedas 'restablecer()' la transmisión. Tiene sus limitaciones y tiene que aceptarlas o usar otra cosa. – Joni

1

También puede hacer esto con anidada do ... while bucles, sin volver a leer cualquier cosa de su flujo:

public void process(File file) throws Exception { 
    BufferedReader input = new BufferedReader(new InputStreamReader(new FileInputStream(file), "ISO-8859-1")); 
    String batchParent = input.readLine(); // read the first line in the file, this is a new batch 
    String batchChild; 
    do { 
     currentBatch = new Batch(batchParent); 
     do { 
      batchChild = input.readLine(); 
     } while (addToBatchIfKeysMatch(batchParent, batchChild)); 
     // if we break out of the inner loop, that means batchChild is a new parent 
     // assign it to batchParent and continue the outer loop 
     batchParent = batchChild; 
    } while (batchParent != null); 
} 

private boolean addToBatchIfKeysMatch(final String batchParent, final String batchChild) { 
    if (batchChild != null && keysMatch(batchParent, batchChild)) { 
     currentBatch.add(batchChild); 
     return true; 
    } else { 
     return false; 
    } 
} 

La clave es simplemente leer cada archivo y cualquiera de los procesos como una línea infantil en el bucle interno, o establezca parentLine en el valor recién leído y continúe con el bucle externo.