2010-02-18 22 views
11

estoy leyendo cada línea del archivo en el siguiente maneraCómo detectar la primera y la última línea durante reader.readLine()?

BufferedReader in = new BufferedReader(new FileReader(inFile)); 

while (null != (line = in.readLine())) { 


} 

Quiero hacer una validación en la primera línea y la última línea solo. ¿Hay alguna manera de comprobar si se trata de una primera línea y la última línea dentro del bucle while

while (null != (line = in.readLine())) {  

    if(firstlineoffile) { 
    } 

    else if (lastlineoffile) { 
    } 

    else 
    { 
    } 

} 
+0

mella su código de 4 espacios para formatearlo como tal. Lo he arreglado para ti en esta publicación. –

Respuesta

11

pregunta fresca. Jugué un poco alrededor y aquí está un SSCCE, simplemente copie y pase.

package com.stackoverflow.q2292917; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.PrintWriter; 

public class Test { 

    public static void main(String... args) throws IOException { 
     // Create test file. 
     File file = new File("/test.txt"); 
     PrintWriter writer = new PrintWriter(file); 
     writer.println("line 1"); 
     writer.println("line 2"); 
     writer.println("line 3"); 
     writer.println("line 4"); 
     writer.println("line 5"); 
     writer.close(); 

     // Read test file. 
     BufferedReader reader = null; 
     try { 
      reader = new BufferedReader(new FileReader(file)); 
      String next, line = reader.readLine(); 
      for (boolean first = true, last = (line == null); !last; first = false, line = next) { 
       last = ((next = reader.readLine()) == null); 

       if (first) { 
        System.out.println("first line: " + line); 
       } else if (last) { 
        System.out.println("last line: " + line); 
       } else { 
        System.out.println("normal line: " + line); 
       } 
      } 
     } finally { 
      if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {} 
     } 

     // Delete test file. 
     file.delete(); 
    } 

} 

Salida:

 
first line: line 1 
normal line: line 2 
normal line: line 3 
normal line: line 4 
last line: line 5 

embargo cuestiono la lectura y la interpretación de los arrancadores ... ;)

+0

¡Muchas gracias! Probé el programa de ejemplo y está funcionando – Arav

+0

De nada. – BalusC

0

si se agrega un recuento, y reorganizar su código un poco, esto debería funcionar (no he probado este modo puede haber errros de sintaxis):

int count = 0; 
String line = in.readLine(); 
while (line!=null) { 
    String currLine = line; 
    if(count==0){ 
    //currLine is the first line 
    } 

    line = in.readLine(); 
    if(line==null){ 
    //currLine is the last line 
    } 

    if(count>0 && line!=null){ 
    //do something with lines in between 
    System.out.println(currLine); 
    } 
    count++; 
} 
+1

Bueno, si line == null has pasado la última línea. Siempre tendrías que mirar hacia adelante y si nextLine == null estás en la última. – Kylar

+1

O puede refactorizar esto en un ciclo do-while, que eliminará 'readLine()' fuera del ciclo. Además, si line == null, la línea _previous_ fue la última línea, no la actual. –

+0

refactorizado un poco para identificar correctamente la última línea – Upgradingdave

0
String currentLine = in.readLine(); 
String nextLine = in.readLine(); 
boolean hasStarted = false; 
while(null != currentLine){ 
    if(!hasStarted){ 
     //first line. 
     hasStarted = true; 
    } 
    //all your processing here. 
    if(null == nextLine){ 
     //last line, cause there's nothing else coming up 
    } 
    currentLine = nextLine; 
    nextLine = in.readLine(); 
} 
-1

Alguien podría así llegar a una solución más elegante que esto, pero aquí vamos:

boolean isFirstLine = true; 
do{ 
     String line = in.readLine(); 
     if(isFirstLine){ 
     //this is the first line 
     isFirstLine = false; 
     } 
     else if(line==null){ //previous line was the last line 
     in.reset(); 
     line = in.readLine(); 
     //do last line specific stuff 
     break; 
     } 
     else { 
      //do stuff for lines in between 
     } 
     in.mark(100); 

}while (line!=null); 

No lo he probado, por lo que podría haber errores menores. No he resuelto el manejo de excepciones en este código. readLine(), mark() y reset() tiro IOException y mark() también pueden lanzar IllegalArgumentException

0
public class Vomitfirstline { 

    public static void main(String[] args) { 

     BufferedReader br = null; 

     try { 

      String sCurrentLine; 

      br = new BufferedReader(new FileReader("Path")); 
      br.readLine(); 

      { 


       while ((sCurrentLine = br.readLine()) != null) 
     System.out.println(sCurrentLine); 

      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       if (br != null)br.close(); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 
    } 
+0

puede verificar el código anterior – Vijay

Cuestiones relacionadas