2013-01-08 9 views
5

Powiedzmy Mam plik tekstowy o nazwie: dane.txt (zawiera 2000 linii)Java: jak korzystać z BufferedReader czytać specjalną linię

Jak odczytać dane z konkretnej linii: 500-1500, a następnie 1500- 2000 i wyświetlać dane wyjściowe określonej linii?

ten kod będzie czytać całych plików (linia 2000)

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

Jak zmodyfikować powyższy kod do odczytu specjalnej linii?

+1

dlaczego nie można po prostu liczyć linii, z której jesteś, a jeśli jesteś w zasięgu Państwo poszukiwanego wyprowadzać linie jeden po drugim? – Stefan

+0

jak to zrobić? Wiem, jak liczyć, ale nie jestem pewien co do wyprowadzenia linii z zakresu – Redbox

+0

Zliczasz, a następnie sprawdzasz licznik za pomocą instrukcji "if". –

Odpowiedz

13

Proponuję java.io.LineNumberReader. Rozciąga BufferedReader i można użyć jej LineNumberReader.getLineNumber(); uzyskać bieżący numer linii

Można również użyć Java 7 java.nio.file.Files.readAllLines która zwraca List<String> jeśli odpowiada Ci lepiej

Uwaga:

1) faworyzować StringBuilder ponad StringBuffer, StringBuffer jest tylko klasa dziedzictwo

2) contents.append(System.getProperty("line.separator")) nie ładnie wyglądać korzystanie contents.append(File.separator) zamiast

3) Catching wyjątek wydaje się nieistotne, Chciałbym również zasugerować, aby zmienić swój kod jako

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

teraz kod wygląda czystsze moim zdaniem. A jeśli jesteś w Javie 7 stosowanie try-with-zasobów

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

więc ostatecznie kod mógłby wyglądać

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

pamiętać, że zwraca 2 ciągi 500-1499 i 1500-2000

+0

Wygląda na to, że Redbox chce mieć 500-1500 i 1500-2000 jako dwa osobne teksty, a więc wydaje się, że –

+0

chcę umieścić tekst (500-1500) na stringA , a następnie tekst (1500-2000) jako stringB można to zrobić? – Redbox

+0

Następnie użyj LineNumberReader, będzie bardziej wydajny –

4

Nieco bardziej czystym rozwiązaniem byłoby użycie FileUtils w apache commons. http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html Przykładowy fragment:

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

Czy muszę ładować apache libs? im przy użyciu jdeveloper – Redbox

+0

Tak, plik jar apache commons-io powinien znajdować się w ścieżce klas. http://www.jarfinder.com/index.php/java/info/org.apache.commons.io.FileUtils –

+0

link w twojej odpowiedzi jest martwy Znajdziesz tutaj FileUtils: http: //commons.apache. org/proper/commons-io / – ConquerorsHaki

1

Lepszym sposobem jest użycie BufferedReader. Jeśli chcesz przeczytać linii 32 na przykład:

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

Teraz w łańcuchach lineThreeTwo zapisaniu linia 32.

Powiązane problemy