Jak mogę czytać duży plik tekstowy linia po linii za pomocą Java?

846

Muszę czytać duży plik tekstowy o wielkości około 5-6 GB wiersz po wierszu, używając Java.

Jak mogę to zrobić szybko?

Manoj Singh
źródło
69
@kamaci i in. glin. To pytanie nie powinno być oznaczone jako duplikat. „Szybki odczyt ostatniej linii” nie jest alternatywą, a kwestią dyskusyjną jest to, czy „Najszybszym sposobem na odczytanie pliku tekstowego linia po linii” jest. Najszybszy sposób na zrobienie czegoś niekoniecznie jest powszechny. Ponadto poniższe odpowiedzi obejmują kod, który nie jest najodpowiedniejszą alternatywą na liście. To pytanie jest przydatne. Jest to obecnie najlepszy wynik wyszukiwania w Google dla „java czytał plik linia po linii”. Wreszcie, jego odłożenie, aby dojść do przepełnienia stosu i stwierdzić, że 1 na każde 2 pytanie jest oznaczony do usunięcia.
Patrick Cullen,
5
Oto porównanie prędkości dla sześciu możliwych implementacji.
Serg M Ten
4
Wydarzenie, chociaż czytam komentarze argumentujące, że ścisła polityka SO jest do bani, SO się w niej utrzymuje. Perspektywa programistów jest tak wąska, aby za wszelką cenę unikać redundancji! Niech tak będzie! Śmietanka podniesie się do góry, a sh * t sama opadnie na dół. Nawet jeśli wcześniej zostało zadane pytanie (które to pytanie nie jest?), Nie oznacza to, że nowe pytanie może nie być w stanie lepiej je sformułować, uzyskać lepsze odpowiedzi, zająć wyższą pozycję w wyszukiwarkach itp. Co ciekawe, to pytanie jest teraz „chronione” ....
Stijn de Witt
3
To niesamowite, jak pytania są oznaczane jako duplikaty, po prostu czytając tytuł.
Łukasz

Odpowiedzi:

1063

Często stosuje się wzorzec

try (BufferedReader br = new BufferedReader(new FileReader(file))) {
    String line;
    while ((line = br.readLine()) != null) {
       // process the line.
    }
}

Możesz odczytać dane szybciej, jeśli założysz, że nie ma kodowania znaków. np. ASCII-7, ale nie zrobi to dużej różnicy. Jest wysoce prawdopodobne, że to, co zrobisz z danymi, potrwa znacznie dłużej.

EDYCJA: Rzadziej stosowany wzór, który pozwala uniknąć linewycieku.

try(BufferedReader br = new BufferedReader(new FileReader(file))) {
    for(String line; (line = br.readLine()) != null; ) {
        // process the line.
    }
    // line is not visible here.
}

AKTUALIZACJA: W Javie 8 możesz to zrobić

try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
        stream.forEach(System.out::println);
}

UWAGA: Musisz umieścić Strumień w bloku try-with-resource , aby upewnić się, że wywoływana jest metoda #close, w przeciwnym razie bazowy uchwyt pliku nigdy nie zostanie zamknięty, dopóki GC nie zrobi tego znacznie później.

Peter Lawrey
źródło
6
Jak wygląda ten wzorzec przy prawidłowej obsłudze wyjątków? Zauważam, że br.close () zgłasza wyjątek IOException, co wydaje się zaskakujące - co może się zdarzyć przy zamykaniu pliku otwartego do odczytu? Konstruktor FileReader może zgłosić wyjątek FileNotFound.
MikeB
3
Jeśli mam plik 200 MB i można go odczytać z prędkością 90 MB / s, to spodziewam się, że zajmie to około 3 s? Wydaje się, że moje zajmuje tyle minut, przy tym „powolnym” sposobie czytania. Korzystam z dysku SSD, więc prędkości odczytu nie powinny stanowić problemu?
Jiew Meng
4
@JiewMeng SO Podejrzewam, że coś innego, co robisz, wymaga czasu. Czy możesz po prostu przeczytać wiersze pliku i nic więcej.
Peter Lawrey,
44
Dlaczego nie? for(String line = br.readLine(); line != null; line = br.readLine())Przy okazji, w Javie 8 możesz zrobić try( Stream<String> lines = Files.lines(...) ){ for( String line : (Iterable<String>) lines::iterator ) { ... } }Co trudno nienawidzić.
Aleksandr Dubinsky
26
@AleksandrDubinsky Problem z zamknięciami w Javie 8 polega na tym, że bardzo łatwo sprawia, że ​​kod jest bardziej skomplikowany do czytania (a także działa wolniej). Widzę, że wielu programistów nadużywa go, ponieważ jest „fajny”.
Peter Lawrey,
155

Spójrz na tego bloga:

Można określić rozmiar bufora lub użyć rozmiaru domyślnego. Wartość domyślna jest wystarczająco duża dla większości celów.

// Open the file
FileInputStream fstream = new FileInputStream("textfile.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));

String strLine;

//Read File Line By Line
while ((strLine = br.readLine()) != null)   {
  // Print the content on the console
  System.out.println (strLine);
}

//Close the input stream
fstream.close();
Naveed
źródło
6
Mój plik ma rozmiar 1,5 Gig i nie można odczytać pliku przy użyciu Twojej odpowiedzi!
Aboozar Rajabi
3
@AboozarRajabi Oczywiście jest to możliwe. Ten kod może odczytać dowolny plik tekstowy.
user207421
10
Doceniony za link niskiej jakości. Jest to całkowicie bezcelowe DataInputStream, a zły strumień zostaje zamknięty. Nie ma nic złego w samouczku Java i nie ma potrzeby cytowania takich śmieci internetowych.
user207421
1
Porzuciłbym komentarze, masz 4 linie w 100% redundantnych komentarzy dla 6 linii kodu.
Buffalo
97

Po wydaniu Java 8 (marzec 2014 r.) Będziesz mógł korzystać ze strumieni:

try (Stream<String> lines = Files.lines(Paths.get(filename), Charset.defaultCharset())) {
  lines.forEachOrdered(line -> process(line));
}

Drukowanie wszystkich linii w pliku:

try (Stream<String> lines = Files.lines(file, Charset.defaultCharset())) {
  lines.forEachOrdered(System.out::println);
}
msayag
źródło
1
Używaj StandardCharsets.UTF_8, używaj Stream<String>dla zwięzłości i unikaj używania, forEach()a zwłaszcza, forEachOrdered()jeśli nie ma powodu.
Aleksandr Dubinsky
2
Dlaczego warto unikać forEach ()? To jest złe?
steventrouble
Jeśli ja forEach zamiast forEachOrders, wiersze mogą być drukowane w porządku, prawda?
msayag
2
@steventrouble Spójrz na: stackoverflow.com/questions/16635398/... Nie jest źle, jeśli przekażesz krótkie odwołanie do funkcji forEach(this::process), ale robi się brzydkie, jeśli piszesz bloki kodu jako lambdy wewnątrz forEach().
Aleksandr Dubinsky
2
@ msayag, masz rację, potrzebujesz forEachOrdered, aby wykonać w kolejności. Pamiętaj, że w takim przypadku nie będziesz w stanie zrównoleglać strumienia, chociaż zauważyłem, że równoległość nie włącza się, chyba że plik ma tysiące linii.
Aleksandr Dubinsky,
38

Oto przykład z pełną obsługą błędów i obsługą specyfikacji zestawów znaków dla wersji wcześniejszej niż Java 7. W Javie 7 można użyć składni try-with-resources, co czyni kod czystszym.

Jeśli chcesz tylko domyślnego zestawu znaków, możesz pominąć InputStream i użyć FileReadera.

InputStream ins = null; // raw byte-stream
Reader r = null; // cooked reader
BufferedReader br = null; // buffered for readLine()
try {
    String s;
    ins = new FileInputStream("textfile.txt");
    r = new InputStreamReader(ins, "UTF-8"); // leave charset out for default
    br = new BufferedReader(r);
    while ((s = br.readLine()) != null) {
        System.out.println(s);
    }
}
catch (Exception e)
{
    System.err.println(e.getMessage()); // handle exception
}
finally {
    if (br != null) { try { br.close(); } catch(Throwable t) { /* ensure close happens */ } }
    if (r != null) { try { r.close(); } catch(Throwable t) { /* ensure close happens */ } }
    if (ins != null) { try { ins.close(); } catch(Throwable t) { /* ensure close happens */ } }
}

Oto wersja Groovy z pełną obsługą błędów:

File f = new File("textfile.txt");
f.withReader("UTF-8") { br ->
    br.eachLine { line ->
        println line;
    }
}
Ciemna gwiazda
źródło
1
Co ByteArrayInputStreamkarma literałem łańcuchowym ma wspólnego z czytaniem dużego pliku tekstowego?
user207421
absolutnie bezużyteczne zamknięcia. Nie ma żadnego powodu, aby zamykać każdy strumień. Jeśli zamkniesz którykolwiek z tych strumieni, automatycznie zamkniesz wszystkie inne strumienie ...
Enerccio,
21

W Javie 8 możesz:

try (Stream<String> lines = Files.lines (file, StandardCharsets.UTF_8))
{
    for (String line : (Iterable<String>) lines::iterator)
    {
        ;
    }
}

Kilka uwag: strumień zwrócony przez Files.lines(w przeciwieństwie do większości strumieni) musi zostać zamknięty. Z powodów wymienionych tutaj unikam używania forEach(). Dziwny kod (Iterable<String>) lines::iteratorrzuca Strumień na Iterable.

Aleksandr Dubinsky
źródło
Brak implementacji Iterabletego kodu jest zdecydowanie brzydki, choć użyteczny. Potrzebuje obsady (tj. (Iterable<String>)) Do pracy.
Stephan
Jak mogę pominąć pierwszą linię za pomocą tej metody?
qed
2
@qedfor(String line : (Iterable<String>) lines.skip(1)::iterator)
Aleksandr Dubinsky
1
Jeśli nie masz zamiaru używać Streamfunkcji, używanie Files.newBufferedReaderzamiast Files.linesi wielokrotne wywoływanie readLine()nulldo użycia konstrukcji (Iterable<String>) lines::iteratorwydaje się znacznie prostsze…
Holger
Dlaczego używasz :: w wierszach :: iterator? Jedyne użycie, jakie znam dla :: :: to spakowanie nazwy metody do funkcji lambda. Parametr w pętli for po: powinien być zmienny, gdy otrzymasz metodę lambda za pomocą ::
Trismegistos
19

Co możesz zrobić, to zeskanować cały tekst za pomocą skanera i przejść przez tekst wiersz po wierszu. Oczywiście powinieneś zaimportować następujące elementy:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public static void readText throws FileNotFoundException {
    Scanner scan = new Scanner(new File("samplefilename.txt"));
    while(scan.hasNextLine()){
        String line = scan.nextLine();
        //Here you can manipulate the string the way you want
    }
}

Skaner zasadniczo skanuje cały tekst. Pętla while służy do przechodzenia przez cały tekst.

Ta .hasNextLine()funkcja to wartość logiczna, która zwraca wartość true, jeśli w tekście jest jeszcze więcej wierszy. Ta .nextLine()funkcja daje ci całą linię jako ciąg znaków, którego możesz użyć w dowolny sposób. Spróbuj System.out.println(line)wydrukować tekst.

Uwaga dodatkowa: .txt to tekst typu pliku.

iskandarchacra
źródło
Czy deklaracja metody nie powinna wyglądać zamiast tego: ´publiczna statyczna void readText wyrzuca FileNotFoundException () {´ Jak: ´publiczna statyczna void readText () wyrzuca FileNotFoundException {´
Ketcomp
Jest to znacznie wolniejsze niż BufferedReader.readLine()i poprosił o najlepszą metodę.
user207421
18

FileReader nie pozwoli ci określić kodowania, użyj InputStreamReaderzamiast tego, jeśli musisz to określić:

try {
    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "Cp1252"));         

    String line;
    while ((line = br.readLine()) != null) {
        // process the line.
    }
    br.close();

} catch (IOException e) {
    e.printStackTrace();
}

Jeśli plik został zaimportowany z systemu Windows, może on mieć kodowanie ANSI (Cp1252), więc musisz określić kodowanie.

żywa miłość
źródło
17

Udokumentowałem i przetestowałem 10 różnych sposobów odczytu pliku w Javie, a następnie uruchomiłem je ze sobą, odczytując je w plikach testowych od 1 KB do 1 GB. Oto najszybsze 3 metody odczytu plików do odczytu pliku testowego 1 GB.

Zauważ, że podczas testów wydajności nie wypisałem niczego na konsolę, ponieważ to naprawdę spowolniłoby test. Chciałem tylko przetestować prędkość odczytu.

1) java.nio.file.Files.readAllBytes ()

Testowane w Javie 7, 8, 9. To była ogólnie najszybsza metoda. Odczyt pliku 1 GB był konsekwentnie krótszy niż 1 sekunda.

import java.io..File;
import java.io.IOException;
import java.nio.file.Files;

public class ReadFile_Files_ReadAllBytes {
  public static void main(String [] pArgs) throws IOException {
    String fileName = "c:\\temp\\sample-1GB.txt";
    File file = new File(fileName);

    byte [] fileBytes = Files.readAllBytes(file.toPath());
    char singleChar;
    for(byte b : fileBytes) {
      singleChar = (char) b;
      System.out.print(singleChar);
    }
  }
}

2) java.nio.file.Files.lines ()

Zostało to pomyślnie przetestowane w Javie 8 i 9, ale nie będzie działać w Javie 7 z powodu braku obsługi wyrażeń lambda. Odczytanie pliku 1 GB zajęło około 3,5 sekundy, co plasuje go na drugim miejscu pod względem odczytu większych plików.

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.stream.Stream;

public class ReadFile_Files_Lines {
  public static void main(String[] pArgs) throws IOException {
    String fileName = "c:\\temp\\sample-1GB.txt";
    File file = new File(fileName);

    try (Stream linesStream = Files.lines(file.toPath())) {
      linesStream.forEach(line -> {
        System.out.println(line);
      });
    }
  }
}

3) BufferedReader

Testowany do pracy w Javie 7, 8, 9. Odczytanie pliku testowego 1 GB zajęło około 4,5 sekundy.

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

public class ReadFile_BufferedReader_ReadLine {
  public static void main(String [] args) throws IOException {
    String fileName = "c:\\temp\\sample-1GB.txt";
    FileReader fileReader = new FileReader(fileName);

    try (BufferedReader bufferedReader = new BufferedReader(fileReader)) {
      String line;
      while((line = bufferedReader.readLine()) != null) {
        System.out.println(line);
      }
    }
  }

Kompletne rankingi dla wszystkich 10 metod odczytu plików znajdują się tutaj .

Gomisha
źródło
1
Twój przewodnik jest niesamowity :)
Faisal Julaidan
Tutaj głównie mierzysz czas System.out.print/println(); zakładasz również, że plik zmieści się w pamięci w pierwszych dwóch przypadkach.
user207421,
Słusznie. Może mógłbym wyrazić te założenia bardziej jednoznacznie w mojej odpowiedzi.
gomisha
16

W Javie 7:

String folderPath = "C:/folderOfMyFile";
Path path = Paths.get(folderPath, "myFileName.csv"); //or any text file eg.: txt, bat, etc
Charset charset = Charset.forName("UTF-8");

try (BufferedReader reader = Files.newBufferedReader(path , charset)) {
  while ((line = reader.readLine()) != null ) {
    //separate all csv fields into string array
    String[] lineVariables = line.split(","); 
  }
} catch (IOException e) {
    System.err.println(e);
}
Diego Duarte
źródło
9
być świadomym! użycie line.split w ten sposób NIE parsuje poprawnie, jeśli pole zawiera przecinek i jest otoczone cudzysłowami. Ten podział zignoruje to i po prostu podzieli pole na części za pomocą wewnętrznego przecinka. HTH, Marcelo.
Marcelo Finki
CSV: plik wartości rozdzielanych przecinkami, dlatego nie należy używać przecinka w polu csv, chyba że chcesz dodać kolejne pole. Tak więc użyj podziału na token przecinka w Javie, gdy parsowanie pliku CSV jest w porządku i dobrze
Diego Duarte
7
Diego, to nie jest poprawne. Jedyny standard CSV (RFC 4180) mówi wyraźnie: „Pola zawierające podział wiersza (CRLF), podwójne cudzysłowy i przecinki powinny być ujęte w cudzysłowy”.
serg.nechaev
2
Użyj, StandardCharsets.UTF_8aby uniknąć zaznaczonego wyjątku wCharset.forName("UTF-8")
Aleksandr Dubinsky
2
Dziękuję „Diego Duarte” za komentarz; Muszę powiedzieć, że zgadzam się z tym, co odpowiada „serg.nechaev”. Widzę przecinki osadzone w plikach csv „cały czas”. Ludzie oczekują, że zostanie to zaakceptowane. z całym szacunkiem. wielkie podziękowania dla „serg.nechaev”. IMHO masz rację. Cheerse Wszyscy.
Marcelo Finki
13

W Javie 8 istnieje również alternatywa do używania Files.lines(). Jeśli źródłem wejściowym nie jest plik, ale coś bardziej abstrakcyjnego, takiego jak a Readerlub an InputStream, możesz przesyłać strumieniowo linie za pomocą metody BufferedReaders lines().

Na przykład:

try (BufferedReader reader = new BufferedReader(...)) {
  reader.lines().forEach(line -> processLine(line));
}

wywoła processLine()każdą linię wejściową odczytaną przez BufferedReader.

Rüdiger Herrmann
źródło
10

Do odczytu pliku w Javie 8

package com.java.java8;

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

/**
 * The Class ReadLargeFile.
 *
 * @author Ankit Sood Apr 20, 2017
 */
public class ReadLargeFile {

    /**
     * The main method.
     *
     * @param args
     *            the arguments
     */
    public static void main(String[] args) {
        try {
            Stream<String> stream = Files.lines(Paths.get("C:\\Users\\System\\Desktop\\demoData.txt"));
            stream.forEach(System.out::println);
        }
        catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
Ankit Sood
źródło
9

Możesz użyć klasy skanera

Scanner sc=new Scanner(file);
sc.nextLine();
Abhilash
źródło
2
@Tim „Bomb horrorly” nie jest terminem, który rozpoznaję w CS. Co dokładnie masz na myśli?
user207421,
Bagno w dół, wykonaj bardzo powoli, najprawdopodobniej awaria. Prawdopodobnie powinienem unikać idiomów na tej stronie;)
Tim
4
@Tim Dlaczego miałby to zrobić?
xehpuk
2
Używanie Scannerjest w porządku, ale ta odpowiedź nie zawiera pełnego kodu do prawidłowego użycia.
Aleksandr Dubinsky
5
@Tim Ten kod nie będzie ani „bombardował strasznie”, ani „bagno”, ani „uruchamiał się bardzo wolno”, ani „najprawdopodobniej ulegał awarii”. W rzeczywistości, jak napisano, prawie natychmiast odczyta tylko jedną linię. W ten sposób możesz odczytać megabajty na sekundę, choć z BufferedReader.readLine()pewnością jest to kilka razy szybsze. Jeśli uważasz inaczej, podaj uzasadnienie.
user207421,
7

Musisz użyć tej readLine()metody w class BufferedReader. Utwórz nowy obiekt z tej klasy i uruchom na nim tę metodę i zapisz go w ciągu.

BufferReader Javadoc

Mistrz C.
źródło
Wygląda na to, że link do BufferReaderAPI jest zepsuty
Sandeep
6

Jasny sposób na osiągnięcie tego,

Na przykład:

Jeśli masz dataFile.txtw bieżącym katalogu

import java.io.*;
import java.util.Scanner;
import java.io.FileNotFoundException;

public class readByLine
{
    public readByLine() throws FileNotFoundException
    {
        Scanner linReader = new Scanner(new File("dataFile.txt"));

        while (linReader.hasNext())
        {
            String line = linReader.nextLine();
            System.out.println(line);
        }
        linReader.close();

    }

    public static void main(String args[])  throws FileNotFoundException
    {
        new readByLine();
    }
}

Dane wyjściowe jak poniżej wprowadź opis zdjęcia tutaj

Rajamohan S.
źródło
Dlaczego to jest jaśniejsze? I nie zamieszczaj tutaj zdjęć tekstu. Opublikuj tekst.
user207421,
Opublikowałeś zdjęcie. To jest zdjęcie tekstu. Mogłeś wyciąć i wkleić tekst bezpośrednio na tej stronie. Nikt nic nie mówił o publikowaniu programów. Publikowanie zdjęć tekstu to strata twojego czasu, na którym mi nie zależy, i przepustowości, którą robię.
user207421
6

Java 9:

try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
    stream.forEach(System.out::println);
}
Abdennour TOUMI
źródło
2
Myślę, że musiszSystem.getProperty("os.name").equals("Linux")
SpringLearner,
5
Nie porównuj ciągów z ==!
JonasCz - Przywróć Monikę
6
Jest to kanoniczny przykład Java 8, jak już opublikowali inni. Dlaczego twierdzisz, że jest to „Java-9”?
Holger
@Holger może mapować pliki, o których zapomniał wspomnieć?
Eugene
aby przetworzyć go linia po linii, możesz spróbować (Stream <String> stream = Files.lines (Paths.get (inputFile))) {stream.forEach ((line) -> {System.out.println (line);} ); }
thanos.a
3
BufferedReader br;
FileInputStream fin;
try {
    fin = new FileInputStream(fileName);
    br = new BufferedReader(new InputStreamReader(fin));

    /*Path pathToFile = Paths.get(fileName);
    br = Files.newBufferedReader(pathToFile,StandardCharsets.US_ASCII);*/

    String line = br.readLine();
    while (line != null) {
        String[] attributes = line.split(",");
        Movie movie = createMovie(attributes);
        movies.add(movie);
        line = br.readLine();
    }
    fin.close();
    br.close();
} catch (FileNotFoundException e) {
    System.out.println("Your Message");
} catch (IOException e) {
    System.out.println("Your Message");
}

Mi to pasuje. Mam nadzieję, że ci to pomoże.

Dipendra Ghatal
źródło
3

Możesz użyć strumieni, aby zrobić to dokładniej:

Files.lines(Paths.get("input.txt")).forEach(s -> stringBuffer.append(s);
ostry
źródło
2
Zgadzam się, że tak naprawdę jest w porządku. Zgadza się, ludzie nie lubią tego z powodu dziwnego wyboru StringBuffer (StringBuilder jest ogólnie preferowany, chociaż może to być po prostu zła nazwa zmiennej). Również dlatego, że jest już wspomniany powyżej.
Andrii Rubtsov,
2

Zwykle wykonuję procedurę czytania od razu:

void readResource(InputStream source) throws IOException {
    BufferedReader stream = null;
    try {
        stream = new BufferedReader(new InputStreamReader(source));
        while (true) {
            String line = stream.readLine();
            if(line == null) {
                break;
            }
            //process line
            System.out.println(line)
        }
    } finally {
        closeQuiet(stream);
    }
}

static void closeQuiet(Closeable closeable) {
    if (closeable != null) {
        try {
            closeable.close();
        } catch (IOException ignore) {
        }
    }
}
Binkan Salaryman
źródło
0

Możesz użyć tego kodu:

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

public class ReadTextFile {

    public static void main(String[] args) throws IOException {

        try {

            File f = new File("src/com/data.txt");

            BufferedReader b = new BufferedReader(new FileReader(f));

            String readLine = "";

            System.out.println("Reading file using Buffered Reader");

            while ((readLine = b.readLine()) != null) {
                System.out.println(readLine);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}
Usman Yaqoob
źródło
Wytłumaczenie byłoby w porządku.
Peter Mortensen
0

Korzystając z pakietu org.apache.commons.io , zwiększył on wydajność, szczególnie w starszym kodzie, który używa Java 6 i niższych wersji.

Java 7 ma lepszy interfejs API z mniejszą obsługą wyjątków i bardziej przydatnymi metodami:

LineIterator lineIterator = null;
try {
    lineIterator = FileUtils.lineIterator(new File("/home/username/m.log"), "windows-1256"); // The second parameter is optionnal
    while (lineIterator.hasNext()) {
        String currentLine = lineIterator.next();
        // Some operation
    }
}
finally {
    LineIterator.closeQuietly(lineIterator);
}

Maven

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>
mohsen.nour
źródło
0

Możesz także użyć Apache Commons IO :

File file = new File("/home/user/file.txt");
try {
    List<String> lines = FileUtils.readLines(file);
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
Do Kra
źródło
3
FileUtils.readLines(file)jest przestarzałą metodą. Dodatkowo metoda wywołuje IOUtils.readLines, która korzysta z BufferedReader i ArrayList. To nie jest metoda linia po linii, a na pewno nie taka, która byłaby praktyczna przy odczytywaniu kilku GB.
vallismortis