Baca Fail ke dalam ArrayList

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan membincangkan pelbagai cara membaca fail ke dalam ArrayList .

Terdapat banyak cara untuk membaca fail di Java. Setelah membaca fail, kami dapat melakukan banyak operasi pada kandungan fail tersebut.

Sebilangan operasi ini, seperti menyusun, mungkin memerlukan memproses keseluruhan kandungan fail ke dalam memori. Untuk melakukan operasi tersebut, kita mungkin perlu membaca fail sebagai Array atau Daftar baris atau perkataan.

2. Menggunakan FileReader

Cara paling asas untuk membaca fail di Java adalah menggunakan FileReader . Secara definisi, FileReader adalah kelas kemudahan untuk membaca aliran watak dari Fail.

Terdapat banyak pembina yang tersedia untuk memulakan FileReader:

FileReader f = new FileReader(String filepath); FileReader f = new FileReader(File f); FileReader f = new FileReader(FileDescriptor fd);

Semua konstruktor ini menganggap bahawa pengekodan watak lalai dan ukuran penampan bait lalai sesuai.

Namun, jika kita ingin memberikan pengekodan karakter khusus dan ukuran buffer byte, kita dapat menggunakan InputStreamReader atau FileInputStream .

Dalam kod berikut, kami akan menunjukkan cara membaca baris dari fail ke ArrayList, menggunakan FileReader:

ArrayList result = new ArrayList(); try (FileReader f = new FileReader(filename)) { StringBuffer sb = new StringBuffer(); while (f.ready()) { char c = (char) f.read(); if (c == '\n') { result.add(sb.toString()); sb = new StringBuffer(); } else { sb.append(c); } } if (sb.length() > 0) { result.add(sb.toString()); } } return result;

3. Menggunakan BufferedReader

Walaupun FileReader cukup mudah digunakan, disarankan untuk selalu membungkusnya dengan BuffereReader , ketika membaca fail.

Ini kerana BufferedReader menggunakan buffer char untuk membaca pelbagai nilai secara serentak dari aliran input watak dan dengan itu mengurangkan jumlah panggilan baca () yang dibuat oleh FileStream yang mendasari .

Pembina untuk BufferedReader mengambil Reader sebagai input. Selain itu, kami juga dapat memberikan ukuran penyangga pada konstruktor, tetapi, untuk kebanyakan kes penggunaan, ukuran lalai cukup besar:

BufferedReader br = new BufferedReader(new FileReader(filename)); BufferedReader br = new BufferedReader(new FileReader(filename), size);

Sebagai tambahan kepada kaedah yang diwarisi dari kelas Reader , BufferedReader juga menyediakan kaedah readLine () , untuk membaca keseluruhan baris sebagai String:

ArrayList result = new ArrayList(); try (BufferedReader br = new BufferedReader(new FileReader(filename))) { while (br.ready()) { result.add(br.readLine()); } } 

4. Menggunakan Pengimbas

Cara lain untuk membaca fail adalah melalui Scanner .

Scanner adalah pengimbas teks ringkas, digunakan untuk menguraikan jenis dan rentetan primitif, menggunakan ungkapan biasa.

Semasa membaca fail, Pengimbas diinisialisasi menggunakan objek File atau FileReader :

Scanner s = new Scanner(new File(filename)); Scanner s = new Scanner(new FileReader(filename));

Sama dengan BufferedReader, Scanner menyediakan kaedah readLine () untuk membaca keseluruhan baris . Selain itu , ia juga menyediakan kaedah hasNext () untuk menunjukkan sama ada lebih banyak nilai tersedia untuk membaca atau tidak:

ArrayList result = new ArrayList(); try (Scanner s = new Scanner(new FileReader(filename))) { while (s.hasNext()) { result.add(s.nextLine()); } return result; }

Pengimbas membahagikan inputnya menjadi token menggunakan pembatas, dengan pembatas lalai adalah ruang kosong. Token ini boleh ditukar menjadi nilai dari pelbagai jenis, dengan menggunakan pelbagai kaedah seterusnya ( nextInt , nextLong , dll) yang tersedia:

ArrayList result = new ArrayList(); try (Scanner s = new Scanner(new FileReader(filename))) { while (s.hasNext()) { result.add(s.nextInt()); } return result; }

5. Menggunakan Files.readAllLines

Mungkin cara termudah untuk membaca fail, dan menguraikan semua barisnya ke dalam ArrayList , adalah dengan menggunakan kaedah readAllLines () yang terdapat di kelas Fail :

List result = Files.readAllLines(Paths.get(filename));

Kaedah ini juga dapat menggunakan parameter charset, untuk dibaca mengikut pengekodan watak tertentu:

Charset charset = Charset.forName("ISO-8859-1"); List result = Files.readAllLines(Paths.get(filename), charset);

6. Kesimpulannya

Sebagai ringkasan, kami membincangkan beberapa cara umum untuk membaca kandungan Fail ke dalam ArrayList . Kami juga merangkumi beberapa kelebihan dan kekurangan dari pelbagai kaedah.

Sebagai contoh, kita boleh menggunakan BufferedReader untuk menyangga watak untuk kecekapan. Sebagai alternatif, kita boleh menggunakan Scanner untuk membaca primitif menggunakan pembatas. Atau mungkin, kita hanya boleh menggunakan Files.readAllLines (), tanpa perlu risau tentang pelaksanaannya.

Seperti biasa, kod tersebut terdapat di repositori GitHub kami.