2013-01-08 16 views
5

Lets sagen, ich habe eine Textdatei namens: data.txt (enthält 2000 Zeilen)java: wie BufferedReader verwenden bestimmte Zeile zu lesen

Wie lese ich bestimmte Zeile aus gegeben: 500-1500 und dann 1500- 2000 und die Ausgabe von bestimmten Zeilen angezeigt werden?

wird dieser Code ganze Dateien (2000 Linie)

public static String getContents(File aFile) { 

     StringBuffer contents = new StringBuffer(); 

     try { 

     BufferedReader input = new BufferedReader(new FileReader(aFile)); 
     try { 
      String line = null; 

      while ((line = input.readLine()) != null){ 
      contents.append(line); 
      contents.append(System.getProperty("line.separator")); 
      } 
     } 
     finally { 
      input.close(); 
     } 
     } 
      catch (IOException ex){ 
      ex.printStackTrace(); 
     } 

     return contents.toString(); 
} 

Wie modifiziere ich oben Code gelesen bestimmte Zeile zu lesen?

+1

, warum Sie nicht nur zählen, die Sie Linie sind und wenn Sie in dem gewünschten Bereich sind Sie die Zeilen nacheinander ausgeben? – Stefan

+0

Wie mache ich das? Ich weiß, wie zu zählen, aber nicht sicher, ob die Zeile mit dem Bereich über Ausgabe – Redbox

+0

Sie zählen und dann überprüfen Sie die Zählung mit einer 'if' Aussage. –

Antwort

13

Ich schlage vor, java.io.LineNumberReader. Es erstreckt sich BufferedReader und Sie seine LineNumberReader.getLineNumber(); können Sie die aktuelle Zeilennummer

Sie auch Java 7 java.nio.file.Files.readAllLines verwenden können, erhalten, die eine List<String> zurück, wenn es Ihnen passt besser

Hinweis:

1) für String über String, ist String nur ein Vermächtnis Klasse

2) contents.append(System.getProperty("line.separator")) nicht schön Verwendung sieht contents.append(File.separator) statt

3) Fangen Ausnahme scheint irrelevant, würde ich auch Ihren Code als

public static String getContents(File aFile) throws IOException { 
    BufferedReader rdr = new BufferedReader(new FileReader("aFile")); 
    try { 
     StringBuilder sb = new StringBuilder(); 
     // read your lines 
     return sb.toString(); 
    } finally { 
     rdr.close(); 
    } 
} 

jetzt ändern vorschlagen Code sieht meiner Meinung nach sauber. Und wenn Sie in Java 7 verwenden versuchen-with-Ressourcen

try (BufferedReader rdr = new BufferedReader(new FileReader("aFile"))) { 
     StringBuilder sb = new StringBuilder(); 
     // read your lines 
     return sb.toString(); 
    } 

so schließlich der Code wie

public static String[] getContents(File aFile) throws IOException { 
    try (LineNumberReader rdr = new LineNumberReader(new FileReader(aFile))) { 
     StringBuilder sb1 = new StringBuilder(); 
     StringBuilder sb2 = new StringBuilder(); 
     for (String line = null; (line = rdr.readLine()) != null;) { 
      if (rdr.getLineNumber() >= 1500) { 
       sb2.append(line).append(File.pathSeparatorChar); 
      } else if (rdr.getLineNumber() > 500) { 
       sb1.append(line).append(File.pathSeparatorChar); 
      } 
     } 
     return new String[] { sb1.toString(), sb2.toString() }; 
    } 
} 

Hinweis aussehen könnte, dass es den Wert 2 Strings 500-1499 und 1500-2000

+0

Es scheint Redbox will 500-1500 und 1500 - 2000 als zwei separate Texte, oder so scheint es –

+0

Ich möchte den Text von (500-1500) zu stringA dann Text von (1500-2000) als StringB möglich, das zu tun? – Redbox

+0

Dann verwenden Sie LineNumberReader, es wird effizienter sein –

4

Eine etwas sauberere Lösung wäre FileUtils in apache commons zu verwenden. http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html Beispiel Snippet:

String line = FileUtils.readLines(aFile).get(lineNumber); 
+0

Muss ich Apache-Bibliotheken laden? Ich benutze jdeveloper – Redbox

+0

Ja, sollte Apache commons-io Jar-Datei im Klassenpfad sein. http://www.jarfinder.com/index.php/java/info/org.apache.commons.io.FileUtils –

+0

der Link in Ihrer Antwort ist tot Sie finden FileUtils hier: http: //commons.apache. org/richtig/commons-io / – ConquerorsHaki

1

Der bessere Weg BufferedReader zu bedienen ist. Wenn Sie möchten, Linie 32 zum Beispiel lesen:

for(int x = 0; x < 32; x++){ 
    buf.readLine(); 
} 
lineThreeTwo = buf.readLine(); 

Jetzt in String lineThreeTwo haben Sie gespeicherte Zeile 32.