Bagaimana saya bisa membaca file teks besar baris demi baris menggunakan Java?

848

Saya perlu membaca file teks besar sekitar 5-6 GB baris demi baris menggunakan Java.

Bagaimana saya bisa melakukan ini dengan cepat?

manoj singh
sumber
69
@kamaci et. Al. Pertanyaan ini tidak boleh ditandai sebagai duplikat. "Cepat membaca baris terakhir" bukan merupakan alternatif, dan masih dapat diperdebatkan apakah "Cara tercepat untuk membaca teks-file baris demi baris" adalah. Cara tercepat untuk melakukan sesuatu belum tentu dengan cara yang umum. Selain itu, jawaban di bawah ini termasuk kode, alternatif yang paling relevan yang tidak Anda daftarkan. Pertanyaan ini bermanfaat. Saat ini merupakan hasil pencarian google teratas untuk "java read file by line". Akhirnya, mematikannya tiba di stack overflow dan menemukan bahwa 1 dari setiap 2 pertanyaan ditandai untuk dibuang.
Patrick Cullen
5
Berikut ini adalah perbandingan kecepatan untuk enam kemungkinan implementasi.
Serg M Ten
4
Meskipun saya telah membaca komentar dengan alasan bahwa kebijakan ketat SO itu payah, SO tetap ada di dalamnya. Ini adalah perspektif pengembang yang berpikiran sempit untuk ingin menghindari redundansi di semua biaya! Biarkan saja! Krim akan naik ke atas dan sh * t akan tenggelam ke dasar dengan baik dengan sendirinya. Meskipun sebuah pertanyaan mungkin telah diajukan sebelumnya (pertanyaan mana yang bukan ??), itu tidak berarti bahwa sebuah pertanyaan baru mungkin tidak dapat mengungkapkannya dengan lebih baik, mendapatkan jawaban yang lebih baik, peringkat yang lebih tinggi di mesin pencari dll. Menariknya, ini pertanyaan sekarang 'dilindungi' ....
Stijn de Witt
3
Sungguh luar biasa bagaimana pertanyaan ditandai sebagai duplikat dengan hanya membaca judulnya.
Luke

Jawaban:

1064

Pola yang umum digunakan

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

Anda dapat membaca data lebih cepat jika Anda menganggap tidak ada pengkodean karakter. misalnya ASCII-7 tetapi tidak akan membuat banyak perbedaan. Sangat mungkin bahwa apa yang Anda lakukan dengan data akan memakan waktu lebih lama.

EDIT: Pola yang kurang umum untuk digunakan yang menghindari ruang lingkup linekebocoran.

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

UPDATE: Di Java 8 Anda bisa melakukannya

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

CATATAN: Anda harus menempatkan Stream di blok coba-dengan-sumber daya untuk memastikan metode #close dipanggil, jika tidak, pegangan file yang mendasarinya tidak pernah ditutup sampai GC melakukannya nanti.

Peter Lawrey
sumber
6
Seperti apa pola ini dengan penanganan pengecualian yang tepat? Saya perhatikan bahwa br.close () melempar IOException, yang tampaknya mengejutkan - apa yang bisa terjadi ketika menutup file yang dibuka untuk dibaca? Konstruktor FileReader mungkin melempar pengecualian FileNotFound.
MikeB
3
Jika saya memiliki file 200MB dan dapat membaca pada 90MB / s maka saya berharap untuk mengambil ~ 3s? Punyaku sepertinya butuh beberapa menit, dengan cara membaca yang "lambat" ini. Saya menggunakan SSD, jadi kecepatan baca seharusnya tidak menjadi masalah?
Jiew Meng
4
@JiewMeng SO Saya akan curiga ada hal lain yang Anda lakukan adalah menyita waktu. Bisakah Anda mencoba hanya membaca baris file dan tidak ada yang lain.
Peter Lawrey
44
Mengapa tidak for(String line = br.readLine(); line != null; line = br.readLine())Btw, di Jawa 8 Anda bisa melakukan try( Stream<String> lines = Files.lines(...) ){ for( String line : (Iterable<String>) lines::iterator ) { ... } }yang sulit untuk tidak membenci.
Aleksandr Dubinsky
26
@AleksandrDubinsky Masalah yang saya miliki dengan penutupan di Java 8 adalah sangat mudah membuat kode lebih rumit untuk dibaca (dan juga lebih lambat) Saya dapat melihat banyak pengembang menggunakannya secara berlebihan karena ini "keren".
Peter Lawrey
155

Lihatlah blog ini:

Ukuran buffer dapat ditentukan, atau ukuran standar dapat digunakan. Standarnya cukup besar untuk sebagian besar keperluan.

// 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
sumber
6
File saya 1,5 Gig dan tidak mungkin membaca file menggunakan jawaban Anda!
Aboozar Rajabi
3
@AboozarRajabi Tentu saja itu mungkin. Kode ini dapat membaca file teks apa pun.
Marquis of Lorne
10
Tunduk unduhan karena tautan berkualitas buruk. Ada yang benar-benar tidak berguna DataInputStream, dan aliran yang salah ditutup. Tidak ada yang salah dengan Tutorial Java, dan tidak perlu mengutip sampah Internet pihak ketiga yang sewenang-wenang seperti ini.
Marquis of Lorne
1
Saya akan membuang komentar, Anda memiliki 4 baris 100% komentar berlebihan untuk 6 baris kode.
Buffalo
98

Setelah Java 8 keluar (Maret 2014) Anda akan dapat menggunakan stream:

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

Mencetak semua baris dalam file:

try (Stream<String> lines = Files.lines(file, Charset.defaultCharset())) {
  lines.forEachOrdered(System.out::println);
}
msayag
sumber
1
Gunakan StandardCharsets.UTF_8, gunakan Stream<String>untuk keringkasan, dan hindari menggunakan forEach()dan terutama forEachOrdered()kecuali ada alasannya.
Aleksandr Dubinsky
2
Mengapa menghindari forEach ()? Apa itu buruk?
steventrouble
Jika saya menggunakan masing-masing untuk setiap orang, bukan untuk setiap orang, garis-garis mungkin dicetak tidak sesuai pesanan, bukan?
msayag
2
@steventrouble Lihatlah: stackoverflow.com/questions/16635398/... Tidak buruk jika Anda melewatkan referensi fungsi pendek seperti forEach(this::process), tetapi akan jelek jika Anda menulis blok kode sebagai lambdas di dalamnya forEach().
Aleksandr Dubinsky
2
@ msayag, Anda benar, Anda perlu forEachOrderedmenjalankan perintah. Perlu diketahui bahwa Anda tidak akan dapat memparalelkan aliran dalam kasus itu, meskipun saya telah menemukan bahwa paralelisasi tidak menyala kecuali file tersebut memiliki ribuan baris.
Aleksandr Dubinsky
38

Berikut adalah contoh dengan penanganan kesalahan penuh dan spesifikasi charset pendukung untuk pra-Java 7. Dengan Java 7 Anda dapat menggunakan sintaks coba-dengan-sumber daya, yang membuat kode lebih bersih.

Jika Anda hanya ingin charset default, Anda dapat melewati InputStream dan menggunakan FileReader.

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 */ } }
}

Ini adalah versi Groovy, dengan penanganan kesalahan penuh:

File f = new File("textfile.txt");
f.withReader("UTF-8") { br ->
    br.eachLine { line ->
        println line;
    }
}
Bintang gelap
sumber
1
Apa hubungannya ByteArrayInputStreamdengan string literal hubungannya dengan membaca file teks besar?
Marquis of Lorne
menutup benar-benar tidak berguna. Tidak ada alasan untuk menutup setiap aliran. Jika Anda menutup salah satu aliran tersebut, Anda secara otomatis menutup semua aliran lainnya ...
Enerccio
21

Di Java 8, Anda bisa melakukan:

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

Beberapa catatan: Aliran dikembalikan oleh Files.lines(tidak seperti kebanyakan aliran) perlu ditutup. Untuk alasan yang disebutkan di sini saya menghindari penggunaan forEach(). Kode aneh (Iterable<String>) lines::iteratormelemparkan Stream ke Iterable.

Aleksandr Dubinsky
sumber
Dengan tidak menerapkan Iterablekode ini secara definitif jelek meskipun bermanfaat. Perlu pemain (yaitu (Iterable<String>)) untuk bekerja.
Stephan
Bagaimana saya bisa melewati baris pertama dengan metode ini?
qed
2
@qedfor(String line : (Iterable<String>) lines.skip(1)::iterator)
Aleksandr Dubinsky
1
Jika Anda tidak berniat untuk benar-benar menggunakan Streamfitur, menggunakan Files.newBufferedReaderalih-alih Files.linesdan berulang kali menelepon readLine()hingga nullalih-alih menggunakan konstruksi seperti (Iterable<String>) lines::iteratortampaknya jauh lebih sederhana ...
Holger
Mengapa Anda menggunakan :: in lines :: iterator? Hanya penggunaan yang saya tahu :: adalah untuk mengemas nama metode ke dalam fungsi lambda. Dalam untuk parameter loop setelah: harus variabel saat Anda mendapatkan beberapa metode lambda menggunakan ::
Trismegistos
19

Yang dapat Anda lakukan adalah memindai seluruh teks menggunakan Pemindai dan menelusuri teks baris demi baris. Tentu saja Anda harus mengimpor yang berikut ini:

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
    }
}

Pemindai pada dasarnya memindai semua teks. Loop sementara digunakan untuk menelusuri seluruh teks.

The .hasNextLine()fungsi adalah boolean yang mengembalikan true jika masih ada lebih banyak garis dalam teks. The .nextLine()Fungsi memberikan seluruh baris sebagai String yang kemudian dapat menggunakan cara yang Anda inginkan. Coba System.out.println(line)cetak teksnya.

Catatan Sisi: .txt adalah teks jenis file.

iskandarchacra
sumber
Bukankah seharusnya deklarasi metode terlihat sebagai berikut: ´ public static void readText melempar FileNotFoundException () {´ Seperti: ´public static batal readText () melempar FileNotFoundException {´
Ketcomp
Ini jauh lebih lambat daripada BufferedReader.readLine(), dan dia meminta metode berkinerja terbaik.
Marquis of Lorne
18

FileReader tidak akan membiarkan Anda menentukan penyandian, gunakan InputStreamReadersebaliknya jika Anda perlu menentukannya:

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

Jika Anda mengimpor file ini dari Windows, mungkin ada encoding ANSI (Cp1252), jadi Anda harus menentukan encoding.

cinta hidup
sumber
17

Saya mendokumentasikan dan menguji 10 cara berbeda untuk membaca file di Java dan kemudian menjalankannya satu sama lain dengan membuat mereka membaca file tes dari 1KB hingga 1GB. Berikut adalah 3 metode membaca file tercepat untuk membaca file tes 1GB.

Perhatikan bahwa ketika menjalankan tes kinerja saya tidak mengeluarkan apa pun ke konsol karena itu akan benar-benar memperlambat tes. Saya hanya ingin menguji kecepatan membaca mentah.

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

Diuji di Java 7, 8, 9. Ini secara keseluruhan adalah metode tercepat. Membaca file 1GB secara konsisten hanya di bawah 1 detik.

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

Ini diuji dengan sukses di Java 8 dan 9 tetapi tidak akan berhasil di Java 7 karena kurangnya dukungan untuk ekspresi lambda. Butuh waktu sekitar 3,5 detik untuk membaca dalam file 1GB yang menempatkannya di posisi kedua sejauh membaca file yang lebih besar.

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

Diuji untuk bekerja di Java 7, 8, 9. Ini membutuhkan waktu sekitar 4,5 detik untuk membaca dalam file uji 1GB.

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

Anda dapat menemukan peringkat lengkap untuk semua 10 metode membaca file di sini .

gomisha
sumber
1
Panduan Anda luar biasa :)
Faisal Julaidan
Anda kebanyakan mengatur waktu di System.out.print/println()sini; Anda juga mengasumsikan file tersebut akan masuk ke memori dalam dua kasus pertama Anda.
Marquis of Lorne
Cukup adil. Mungkin saya bisa membuat asumsi-asumsi itu lebih eksplisit dalam jawaban saya.
gomisha
16

Di Jawa 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
sumber
9
Waspadalah! menggunakan line.split dengan cara ini TIDAK akan menguraikan dengan benar jika bidang berisi koma dan dikelilingi oleh tanda kutip. Pemisahan ini akan mengabaikan itu dan hanya memisahkan bidang dalam potongan menggunakan koma internal. HTH, Marcelo.
Marcelo Finki
CSV: File Nilai Terpisah Koma, jadi Anda tidak boleh menggunakan koma di bidang csv, kecuali jika Anda ingin menambahkan bidang lain. Jadi, gunakan split untuk tanda koma di java ketika mem-parsing file CSV baik-baik saja dan benar
Diego Duarte
7
Diego, ini tidak benar. Satu-satunya standar CSV (RFC 4180) yang secara spesifik mengatakan "Fields yang mengandung line break (CRLF), tanda kutip ganda, dan koma harus diapit tanda kutip ganda."
serg.nechaev
2
Gunakan StandardCharsets.UTF_8untuk menghindari pengecualian yang dicentang diCharset.forName("UTF-8")
Aleksandr Dubinsky
2
Terima kasih "Diego Duarte" atas komentar Anda; saya harus mengatakan saya setuju dengan balasan "serg.nechaev". Saya melihat koma tertanam dalam file csv 'sepanjang waktu'. Orang-orang berharap ini akan diterima. dengan segala hormat. juga terima kasih banyak untuk "serg.nechaev". IMHO kamu benar. Curang semuanya.
Marcelo Finki
13

Di Java 8, ada juga alternatif untuk menggunakan Files.lines(). Jika sumber input Anda bukan file tetapi sesuatu yang lebih abstrak seperti Readeratau InputStream, Anda dapat mengalirkan baris melalui metode BufferedReaders lines().

Sebagai contoh:

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

akan memanggil processLine()setiap jalur input yang dibaca oleh BufferedReader.

Rüdiger Herrmann
sumber
10

Untuk membaca file dengan Java 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
sumber
9

Anda dapat menggunakan kelas Scanner

Scanner sc=new Scanner(file);
sc.nextLine();
Abhilash
sumber
2
@Tim 'Bom mengerikan' bukan istilah yang saya kenal di CS. Apa sebenarnya maksud Anda?
Marquis of Lorne
Bog down, jalankan sangat lambat, kemungkinan besar crash. Saya mungkin harus menghindari idiom di situs ini;)
Tim
4
@ Tim Mengapa itu melakukannya?
xehpuk
2
Penggunaannya Scannerbaik-baik saja, tetapi jawaban ini tidak menyertakan kode lengkap untuk menggunakannya dengan benar.
Aleksandr Dubinsky
5
@Tim Kode ini tidak akan 'bom mengerikan' atau 'macet' atau 'jalankan sangat lambat' atau 'kemungkinan besar crash'. Faktanya seperti yang tertulis itu hanya akan membaca satu baris, hampir secara instan. Anda dapat membaca megabyte per detik dengan cara ini, meskipun BufferedReader.readLine()tentu saja beberapa kali lebih cepat. Jika Anda berpikir sebaliknya, berikan alasan Anda.
Marquis of Lorne
7

Anda perlu menggunakan readLine()metode ini di class BufferedReader. Buat objek baru dari kelas itu dan operasikan metode ini padanya dan simpan ke string.

BufferReader Javadoc

Master C
sumber
Sepertinya tautan ke BufferReaderAPI rusak
Sandeep
6

Cara yang jelas untuk mencapai ini,

Sebagai contoh:

Jika ada dataFile.txtdi direktori Anda saat ini

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

Output seperti di bawah ini, masukkan deskripsi gambar di sini

Rajamohan S
sumber
Mengapa lebih jelas? Dan jangan memposting gambar teks di sini. Posting teks.
Marquis of Lorne
Anda memposting gambar. Ini adalah gambar teks. Anda bisa memotong dan menempelkan teks langsung ke halaman ini. Tidak ada yang mengatakan apa pun tentang memposting program. Posting gambar teks adalah buang-buang waktu Anda, yang saya tidak peduli, dan bandwidth Anda, yang saya lakukan.
Marquis of Lorne
6

Java 9:

try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
    stream.forEach(System.out::println);
}
Abdennour TOUMI
sumber
2
Saya pikir Anda harusSystem.getProperty("os.name").equals("Linux")
SpringLearner
5
Jangan membandingkan string dengan ==!
JonasCz
6
Ini adalah contoh Java 8 kanonik, sebagaimana telah diposting oleh orang lain. Mengapa Anda mengklaim bahwa ini "Java-9"?
Holger
@Holger memetakan file memori yang dia lupa sebutkan mungkin?
Eugene
untuk memprosesnya baris demi baris, Anda dapat mencoba (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");
}

Ini bekerja untuk saya. Semoga ini akan membantu Anda juga.

Dipendra Ghatal
sumber
3

Anda dapat menggunakan stream untuk melakukannya lebih tepat:

Files.lines(Paths.get("input.txt")).forEach(s -> stringBuffer.append(s);
rapi
sumber
2
Saya setuju bahwa itu sebenarnya baik-baik saja. Aguess, orang tidak menyukainya karena pilihan StringBuffer yang aneh (StringBuilder umumnya lebih disukai, meskipun itu mungkin hanya nama yang buruk untuk variabel). Juga karena sudah disebutkan di atas.
Andrii Rubtsov
2

Saya biasanya melakukan rutinitas membaca langsung:

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) {
        }
    }
}
Gaji Binkan
sumber
0

Anda dapat menggunakan kode ini:

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
sumber
Penjelasan akan diurutkan.
Peter Mortensen
0

Dengan menggunakan paket org.apache.commons.io , itu memberikan kinerja lebih, terutama dalam kode legacy yang menggunakan Java 6 dan di bawah.

Java 7 memiliki API yang lebih baik dengan penanganan pengecualian yang lebih sedikit dan metode yang lebih berguna:

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
sumber
0

Anda juga dapat menggunakan 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();
}
Untuk Kra
sumber
3
FileUtils.readLines(file)adalah metode yang sudah usang. Selain itu, metode ini memanggil IOUtils.readLines, yang menggunakan BufferedReader dan ArrayList. Ini bukan metode baris demi baris, dan tentu saja bukan metode yang praktis untuk membaca beberapa GB.
vallismortis