2010-02-18 4 views
11

ich jede Zeile der Datei in dem unten stehenden Art und WeiseWie erkennt man die erste und letzte Zeile während der reader.readLine()?

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

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


} 

Ich möchte das Lesen allein eine Validierung in der ersten Zeile und letzte Zeile zu tun. Gibt es eine Möglichkeit zu überprüfen, ob es innerhalb der while-Schleife

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

    if(firstlineoffile) { 
    } 

    else if (lastlineoffile) { 
    } 

    else 
    { 
    } 

} 
+0

einrücken Code von 4 Leerzeichen es als solches zu formatieren. Ich habe es für dich in diesem Post behoben. –

Antwort

11

Kühle Frage werfen. Ich habe ein bisschen herumgespielt und hier ist ein SSCCE, nur copy'n'paste'n'run.

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

} 

Ausgang:

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

ich jedoch in Frage, die Lesbarkeit und Interpretierbarkeit von Anfang ... ;)

+0

Vielen Dank! Versuchte das Beispielprogramm und es funktioniert – Arav

+0

Gern geschehen. – BalusC

0

eine erste und letzte Linie ist, wenn Sie einen Zähler hinzufügen und Ihr Code ein wenig neu zu sortieren, sollte diese Arbeit (ich nicht getestet haben, so es kann Syntax Fehlern durchsuchen sein):

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

Nun, wenn Zeile == null Sie sind hinter der letzten Zeile. Du müsstest immer nach vorne schauen und wenn nextLine == null bist, bist du bei der letzten. – Kylar

+1

Oder Sie können dies in eine Do-While-Schleife umwandeln, die die 'readLine()' außerhalb der Schleife los wird. Wenn line == null ist, war die Zeile _previous_ die letzte Zeile und nicht die aktuelle Zeile. –

+0

refaktoriert ein bisschen, um die letzte Zeile korrekt zu identifizieren – 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

Jemand gut mit einer eleganteren Lösung als diese kommen könnte, aber hier gehen wir:

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

Ich habe dies nicht getestet, daher können kleinere Fehler auftreten. Ich habe die Ausnahmebehandlung in diesem Code nicht aussortiert. readLine(), mark() und reset() Wurf IOException und mark() können auch 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

können Sie den obigen Code überprüfen – Vijay

Verwandte Themen