Cara membaca teks besar file baris demi baris menggunakan Java?
Saya perlu untuk membaca file teks besar sekitar 5-6 GB baris demi baris menggunakan Java.
Bagaimana saya bisa melakukan ini dengan cepat?
811
21
Pola yang umum adalah dengan menggunakan
Anda dapat membaca data lebih cepat jika anda menganggap tidak ada pengkodean karakter. misalnya ASCII-7 tapi itu tidak't membuat banyak perbedaan. Hal ini sangat mungkin bahwa apa yang anda lakukan dengan data-data yang akan memakan waktu lebih lama.
EDIT: YANG kurang umum pola penggunaan yang menghindari lingkup
line
bocor.UPDATE: Di Jawa 8 yang dapat anda lakukan
CATATAN: Anda harus menempatkan Streaming di mencoba-dengan-sumber daya blok untuk memastikan #dekat metode ini disebut di atasnya, jika tidak menangani file yang mendasari adalah tidak pernah ditutup sampai GC tidak lama kemudian.
Lihat di blog ini:
Setelah [tag:jawa-8] keluar (Maret 2014), kau'akan dapat menggunakan aliran:
Cetak semua baris dalam file:
Berikut adalah sampel dengan penuh kesalahan penanganan dan mendukung charset spesifikasi untuk pra-Jawa 7. Dengan Java 7 anda dapat menggunakan try-dengan-sumber daya sintaks, yang membuat kode cleaner.
Jika anda hanya ingin default charset anda dapat melewatkan InputStream dan menggunakan FileReader.
Berikut ini adalah Groovy versi, dengan penuh penanganan kesalahan:
Di Java 8, anda bisa melakukan:
Beberapa catatan: aliran dikembalikan oleh
File.garis-garis
(tidak seperti kebanyakan sungai) harus ditutup. Untuk alasan yang disebutkan di sini saya menghindari menggunakanforEach()
. Aneh code(Iterable<String>) garis::iterator
melemparkan Streaming ke Iterable.Apa yang dapat anda lakukan adalah memindai seluruh teks menggunakan Scanner dan pergi melalui teks baris demi baris. Tentu saja anda harus mengimpor berikut:
Scanner pada dasarnya scan semua teks. Loop while digunakan untuk melintasi melalui seluruh teks.
The
.hasNextLine()
fungsi boolean yang mengembalikan true jika masih ada lebih banyak baris dalam teks. The.nextLine()
fungsi memberikan anda sebuah garis sebagai String yang kemudian dapat anda gunakan dengan cara yang anda inginkan. MencobaSistem.keluar.println(line)
untuk mencetak teks.Catatan: .txt adalah jenis file teks.
FileReader won't membiarkan anda menentukan encoding, gunakan
InputStreamReader
bukan jika anda perlu untuk menentukan itu:Jika anda mengimpor file ini dari Windows, mungkin ANSI encoding (Cp1252), sehingga anda harus menentukan encoding.
Di Jawa 7:
Saya terdokumentasi dan teruji 10 cara yang berbeda untuk membaca file di Jawa dan kemudian berlari mereka terhadap satu sama lain dengan membuat mereka baca di test file dari 1KB 1GB. Berikut ini adalah tercepat 3 membaca file metode untuk membaca 1GB file tes.
Perhatikan bahwa ketika menjalankan tes kinerja saya didn't output apa pun ke konsol karena itu akan benar-benar memperlambat tes. Aku hanya ingin menguji mentah kecepatan membaca.
Diuji di Java 7, 8, 9. Ini adalah keseluruhan metode tercepat. Membaca 1GB file secara konsisten hanya di bawah 1 detik.
Ini telah berhasil diuji di Jawa 8 dan 9, tetapi itu tidak't bekerja di Java 7 karena kurangnya dukungan terhadap ekspresi lambda. Butuh waktu sekitar 3,5 detik untuk membaca di sebuah 1GB file yang meletakkannya di tempat kedua sejauh membaca file yang lebih besar.
Diuji untuk bekerja di Java 7, 8, 9. Ini butuh waktu sekitar 4,5 detik untuk membaca di sebuah 1GB file tes.
Anda dapat menemukan peringkat lengkap untuk semua 10 membaca file metode di sini.
Di Java 8, ada juga alternatif untuk menggunakan
Files.garis()
. Jika anda input sumber isn't file tapi sesuatu yang lebih abstrak sepertiReader
atauInputStream
, anda dapat stream garis melaluiBufferedReader ini
garis()` metode.Misalnya:
akan sebut
processLine()
untuk setiap input line dibaca olehBufferedReader
.Untuk Membaca file dengan jawa 8
Anda dapat menggunakan Scanner kelas
Anda perlu menggunakan
readLine()
metodeclass BufferedReader
. Membuat objek baru dari kelas itu dan beroperasi metode ini pada-nya dan menyimpannya ke sebuah string.BufferReader Javadoc
Jawa-9 :
Cara yang jelas untuk mencapai hal ini,
Misalnya:
Jika anda memiliki
dataFile.txt
pada direktori anda saat iniOutput seperti di bawah ini,
Ia bekerja untuk saya. Berharap Ini akan membantu anda terlalu.
Saya biasanya melakukan pembacaan rutin sederhana:
Anda dapat menggunakan sungai untuk melakukannya lebih tepatnya:
dengan menggunakan org.apache.commons.io paket memberikan kinerja yang lebih terutama dalam warisan kode yang menggunakan Java 6 dan di bawah. Java7 telah baik API dengan sedikit pengecualian penanganan dan metode yang lebih berguna
maven
Anda juga dapat menggunakan
apache commons io
: