2010-02-18 6 views
11

Je lis chaque ligne du fichier de la manière ci-dessousComment détecter la première et la dernière ligne pendant reader.readLine()?

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

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


} 

Je veux faire une validation dans la première ligne et la dernière seule ligne. Y at-il moyen de vérifier si elle est une première ligne et la dernière ligne dans la boucle while

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

    if(firstlineoffile) { 
    } 

    else if (lastlineoffile) { 
    } 

    else 
    { 
    } 

} 
+0

Indentation votre code de 4 espaces pour formater en tant que tel. Je l'ai réparé pour vous dans ce post. –

Répondre

11

question cool. J'ai joué un peu autour de ça et voici un SSCCE, il suffit de le copier et le coller.

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(); 
    } 

} 

Sortie:

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

je remets en question mais la lisibilité et l'intelligibilité par entrées ... ;)

+0

Merci beaucoup! J'ai essayé le programme d'exemple et ça marche – Arav

+0

De rien. – BalusC

0

si vous ajoutez un compte et de réordonner votre code un peu, cela devrait fonctionner (je ne l'ai pas testé cette façon il peut y avoir syntaxe errros):

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

Eh bien, si line == null vous avez dépassé la dernière ligne. Vous devez toujours regarder en avant et si nextLine == null vous êtes au dernier. – Kylar

+1

Ou vous pouvez refactoriser ceci en une boucle do-while, qui va se débarrasser de la 'readLine()' en dehors de la boucle. De plus, si line == null, la ligne _previous_ était la dernière ligne, pas la ligne courante. –

+0

refacturé un peu pour identifier correctement la dernière ligne – 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

Quelqu'un pourrait bien trouver une solution plus élégante que cela, mais on y va:

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); 

Je n'ai pas testé cela, donc il pourrait y avoir des erreurs mineures. Je n'ai pas réglé la gestion des exceptions dans ce code. readLine(), mark() et reset() lancer IOException et mark() peuvent également jeter 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

pouvez-vous vérifier le code ci-dessus – Vijay

Questions connexes