Baca semua teks dari file
Java 11 menambahkan metode readString () untuk membaca file kecil sebagai String
, mempertahankan terminator garis:
String content = Files.readString(path, StandardCharsets.US_ASCII);
Untuk versi antara Java 7 dan 11, berikut adalah idiom yang ringkas dan kuat, terbungkus dalam metode utilitas:
static String readFile(String path, Charset encoding)
throws IOException
{
byte[] encoded = Files.readAllBytes(Paths.get(path));
return new String(encoded, encoding);
}
Baca baris teks dari file
Java 7 menambahkan metode kenyamanan untuk membaca file sebagai baris teks, direpresentasikan sebagai List<String>
. Pendekatan ini "lossy" karena pemisah garis dilucuti dari akhir setiap baris.
List<String> lines = Files.readAllLines(Paths.get(path), encoding);
Java 8 menambahkan Files.lines()
metode untuk menghasilkan a Stream<String>
. Sekali lagi, metode ini lossy karena pemisah garis dilucuti. Jika IOException
ditemui saat membaca file, itu dibungkus dalam UncheckedIOException
, karena Stream
tidak menerima lambdas yang melempar pengecualian yang diperiksa.
try (Stream<String> lines = Files.lines(path, encoding)) {
lines.forEach(System.out::println);
}
Ini Stream
memang membutuhkan close()
panggilan; ini tidak terdokumentasi dengan baik di API, dan saya curiga banyak orang yang bahkan tidak menyadari Stream
adanyaclose()
metode. Pastikan untuk menggunakan blok ARM seperti yang ditunjukkan.
Jika Anda bekerja dengan sumber selain file, Anda dapat menggunakan lines()
metode ini diBufferedReader
sebagai gantinya.
Pemanfaatan memori
Metode pertama, yang mempertahankan jeda baris, untuk sementara waktu membutuhkan memori beberapa kali ukuran file, karena untuk waktu yang singkat isi file mentah (array byte), dan karakter yang diterjemahkan (masing-masing adalah 16 bit bahkan jika dikodekan) sebagai 8 bit dalam file) berada di memori sekaligus. Itu paling aman untuk diterapkan ke file yang Anda tahu kecil relatif terhadap memori yang tersedia.
Metode kedua, membaca baris, biasanya lebih efisien memori, karena buffer byte input untuk decoding tidak perlu mengandung seluruh file. Namun, itu masih tidak cocok untuk file yang sangat besar relatif terhadap memori yang tersedia.
Untuk membaca file besar, Anda memerlukan desain yang berbeda untuk program Anda, yang membaca sepotong teks dari stream, memprosesnya, dan kemudian pindah ke yang berikutnya, menggunakan kembali blok memori berukuran tetap yang sama. Di sini, "besar" tergantung pada spesifikasi komputer. Saat ini, ambang ini mungkin banyak RAM gigabytes. Metode ketiga, menggunakan a Stream<String>
adalah salah satu cara untuk melakukan ini, jika input Anda "catatan" kebetulan menjadi baris individual. (Menggunakan readLine()
metode BufferedReader
adalah prosedur yang setara dengan pendekatan ini.)
Pengkodean karakter
Satu hal yang hilang dari sampel dalam posting asli adalah pengkodean karakter. Ada beberapa kasus khusus di mana platform default adalah apa yang Anda inginkan, tetapi jarang, dan Anda harus dapat membenarkan pilihan Anda.
The StandardCharsets
kelas mendefinisikan beberapa konstanta untuk pengkodean diperlukan dari semua runtimes Jawa:
String content = readFile("test.txt", StandardCharsets.UTF_8);
Platform standar tersedia dari yang Charset
kelas itu sendiri:
String content = readFile("test.txt", Charset.defaultCharset());
Catatan: Jawaban ini sebagian besar menggantikan versi Java 6 saya. Utilitas Java 7 dengan aman menyederhanakan kode, dan jawaban lama, yang menggunakan buffer byte yang dipetakan, mencegah file yang dibaca tidak dihapus sampai buffer yang dipetakan dikumpulkan dari sampah. Anda dapat melihat versi lama melalui tautan "diedit" pada jawaban ini.