1. Ikhtisar
Tutorial ini akan menunjukkan cara membaca file besar secara efisien di Java. Java - kembali ke dasar -dasarnya.
2. Baca dalam Memori
Cara standar untuk membaca baris file adalah membaca di memori. Baik Guava dan Apachecommonsio menyediakan metode untuk membaca baris file dengan cepat sebagai berikut:
Files.readLines(new File(path), Charsets.UTF_8);
FileUtils.readLines(new File(path));
Masalah dengan metode ini adalah bahwa semua baris file disimpan dalam memori, dan ketika file cukup besar, itu akan dengan cepat menyebabkan program melempar pengecualian outofmemoryerror.
Misalnya: Baca file sekitar 1G:
@Testpublic void giverusingguava_wheniteratingafile_thenworks () melempar ioException {string path = ... file.readlines (file baru (path), charsets.utf_8);}Metode ini hanya membutuhkan sedikit memori di awal: (mengkonsumsi sekitar 0MB memori)
[Utama] info org.baeldung.java.corejavaiounittest - Total memori: 128 MB [main] info org.baeldung.java.corejavaiounittest - Memori gratis: 116 MB
Namun, ketika semua file dibaca ke dalam memori, kita akhirnya bisa melihat (sekitar 2GB memori dikonsumsi):
[Utama] info org.baeldung.java.corejavaiounittest - Total memori: 2666 MB [utama] info org.baeldung.java.corejavaiounittest - memori gratis: 490 mb
Ini berarti bahwa proses ini mengkonsumsi sekitar 2.1GB memori - alasannya sederhana: Sekarang semua baris file disimpan dalam memori.
Menempatkan semua isi file dalam memori akan dengan cepat kehabisan memori yang tersedia - tidak peduli seberapa besar memori yang tersedia aktual, ini jelas.
Selain itu, kita biasanya tidak perlu memasukkan semua baris file ke dalam memori sekaligus - sebagai gantinya, kita hanya perlu melintasi setiap baris file, kemudian melakukan pemrosesan yang sesuai, dan membuangnya setelah diproses. Jadi, itulah yang akan kita lakukan - beralih melalui baris, alih -alih meletakkan semua baris dalam memori.
3. Stream File
Sekarang mari kita lihat solusi ini - kita akan menggunakan kelas java.util.scanner untuk memindai isi file dan membacanya terus -menerus baris demi baris:
FileInputStream inputStream = null; scanner sc = null; coba {inputStream = new fileInputStream (path); sc = pemindai baru (inputStream, "UTF-8"); while (sc.hasnextline ()) {string line = sc.nextline (); // System.out.println (baris); } // Perhatikan bahwa pemindai menekan pengecualian jika (sc.ioException ()! = null) {throw sc.ioException (); }} akhirnya {if (inputStream! = null) {inputStream.close (); } if (sc! = null) {sc.close (); }}Solusi ini akan melintasi semua baris dalam file - memungkinkan setiap baris diproses tanpa menyimpan referensi untuk itu. Bagaimanapun, mereka tidak disimpan dalam memori: (sekitar 150MB memori dikonsumsi)
[Utama] infoorg.baeldung.java.corejavaiounittest-TotalMemory: 763MB
[utama] infoorg.baeldung.java.corejavaiounittest-freememory: 605MB
4. Apachecommonsio Stream
Anda juga dapat menggunakan Perpustakaan Commonsio untuk mengimplementasikannya, menggunakan lineiterator khusus yang disediakan oleh perpustakaan:
Lineiterator it = fileutils.lineiterator (theFile, "UTF-8"); coba {while (it.hasnext ()) {string line = it.nextline (); // Lakukan sesuatu dengan baris}} akhirnya {lineiterator.closequietly (it);}Karena seluruh file tidak disimpan dalam memori, ini mengarah pada konsumsi memori yang agak konservatif: (sekitar 150MB memori dikonsumsi)
[Utama] Infoo.B.java.CoreJavaioIntegrationTest-TotalMemory: 752MB
[Utama] Infoo.b.java.coreJavaioIntegrationTest-Freememory: 564MB
5. Kesimpulan
Artikel singkat ini menjelaskan cara memproses file besar tanpa membaca berulang dan kehabisan memori - ini memberikan solusi yang berguna untuk memproses file besar.
Semua contoh ini diimplementasikan dan cuplikan kode yang tersedia di proyek GitHub saya - ini adalah proyek berbasis gerhana, sehingga harus dengan mudah diimpor dan dijalankan.
Di atas adalah semua konten artikel ini tentang pembacaan file besar Java yang efisien. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!