Panduan untuk Kelas Pembaca Fail Java

1. Gambaran keseluruhan

Seperti namanya, FileReader adalah kelas Java yang memudahkan membaca isi fail .

Dalam tutorial ini, kita akan mempelajari konsep asas Pembaca dan bagaimana kita dapat menggunakan kelas FileReader untuk melakukan operasi membaca pada aliran watak di Java.

2. Asas Pembaca

Sekiranya kita melihat kod kelas FileReader , maka kita akan melihat bahawa kelas tersebut mengandungi kod minimum untuk membuat objek FileReader dan tidak ada kaedah lain.

Ini menimbulkan persoalan seperti "Siapa yang mengangkat berat di belakang kelas ini?"

Untuk menjawab persoalan ini, kita mesti memahami konsep dan hierarki kelas Pembaca di Jawa.

Reader adalah kelas asas abstrak yang menjadikan watak membaca dapat dilakukan melalui salah satu pelaksanaannya yang konkrit. Ia menentukan operasi asas berikut untuk membaca watak dari mana-mana medium seperti memori atau sistem fail:

  • Baca watak tunggal
  • Baca pelbagai watak
  • Tandakan dan tetapkan semula kedudukan tertentu dalam aliran watak
  • Langkau kedudukan semasa membaca aliran watak
  • Tutup aliran input

Secara semula jadi, semua pelaksanaan kelas Reader mesti melaksanakan semua kaedah abstrak, iaitu read () dan close () . Lebih-lebih lagi, kebanyakan pelaksanaan juga mengatasi kaedah lain yang diwarisi untuk memberikan fungsi tambahan atau prestasi yang lebih baik.

2.1. Bilakah Menggunakan FileReader

Sekarang setelah kita memahami tentang Pembaca , kita bersedia untuk mengembalikan fokus kita ke kelas FileReader .

FileReader mewarisi fungsinya dari InputStreamReader , yang merupakan implementasi Pembaca yang dirancang untuk membaca bait dari aliran input sebagai watak.

Mari lihat hierarki ini dalam definisi kelas:

public class InputStreamReader extends Reader {} public class FileReader extends InputStreamReader {}

Secara umum, kita dapat menggunakan InputStreamReader untuk membaca watak dari mana-mana sumber input.

Namun, ketika membaca teks dari file, menggunakan InputStreamReader akan seperti memotong epal dengan pedang. Sudah tentu, alat yang tepat adalah pisau, tepat seperti yang dijanjikan oleh FileReader .

Kita dapat menggunakan FileReader ketika kita ingin membaca teks dari fail menggunakan set watak lalai sistem. Untuk fungsi lanjutan lain, sangat sesuai untuk menggunakan kelas InputStreamReader secara langsung.

3. Membaca Fail Teks dengan Pembaca Fail

Mari kita ikuti latihan pengekodan membaca watak dari fail HelloWorld.txt menggunakan contoh FileReader .

3.1. Membuat Pembaca Fail

Sebagai kelas kemudahan, FileReader menawarkan tiga pembina yang terlalu banyak yang dapat digunakan untuk menginisialisasi pembaca yang dapat membaca dari fail sebagai sumber input.

Mari lihat pembina ini:

public FileReader(String fileName) throws FileNotFoundException { super(new FileInputStream(fileName)); } public FileReader(File file) throws FileNotFoundException { super(new FileInputStream(file)); } public FileReader(FileDescriptor fd) { super(new FileInputStream(fd)); }

Dalam kes kami, kami mengetahui nama fail fail input. Oleh itu, kita boleh menggunakan konstruktor pertama untuk memulakan pembaca:

FileReader fileReader = new FileReader(path);

3.2. Membaca Watak Tunggal

Seterusnya, mari buat readAllCharactersOneByOne () , kaedah untuk membaca watak dari fail satu demi satu:

public static String readAllCharactersOneByOne(Reader reader) throws IOException { StringBuilder content = new StringBuilder(); int nextChar; while ((nextChar = reader.read()) != -1) { content.append((char) nextChar); } return String.valueOf(content); }

Seperti yang dapat kita lihat dari kod di atas, kita telah menggunakan kaedah read () dalam satu gelung untuk membaca watak satu persatu sehingga ia kembali -1 , yang bermaksud tidak ada lagi watak untuk dibaca.

Sekarang, mari kita menguji kod kami dengan mengesahkan bahawa teks yang dibaca dari fail sepadan dengan teks yang diharapkan:

@Test public void givenFileReader_whenReadAllCharacters_thenReturnsContent() throws IOException { String expectedText = "Hello, World!"; File file = new File(FILE_PATH); try (FileReader fileReader = new FileReader(file)) { String content = FileReaderExample.readAllCharactersOneByOne(fileReader); Assert.assertEquals(expectedText, content); } }

3.3. Bacaan Array of Characters

Kita bahkan boleh membaca beberapa watak sekaligus menggunakan kaedah baca (war cbuf [], int off, int len) yang diwarisi :

public static String readMultipleCharacters(Reader reader, int length) throws IOException { char[] buffer = new char[length]; int charactersRead = reader.read(buffer, 0, length); if (charactersRead != -1) { return new String(buffer, 0, charactersRead); } else { return ""; } }

Terdapat perbezaan yang halus dalam nilai pengembalian read () ketika membaca banyak watak dalam array. Yang nilai pulangan sini ialah sama ada bilangan aksara membaca atau -1 jika pembaca telah sampai ke penghujung aliran input.

Seterusnya, mari kita uji kebenaran kod kami:

@Test public void givenFileReader_whenReadMultipleCharacters_thenReturnsContent() throws IOException { String expectedText = "Hello"; File file = new File(FILE_PATH); try (FileReader fileReader = new FileReader(file)) { String content = FileReaderExample.readMultipleCharacters(fileReader, 5); Assert.assertEquals(expectedText, content); } }

4. Batasan

Kami telah melihat bahawa kelas FileReader bergantung pada pengekodan watak sistem lalai.

Jadi, untuk situasi di mana kita perlu menggunakan nilai khusus untuk set watak, ukuran penyangga, atau aliran input, kita harus menggunakan InputStreamReader .

Lebih-lebih lagi, kita semua tahu bahawa kitaran I / O itu mahal dan dapat memperkenalkan latensi untuk aplikasi kita. Oleh itu, adalah kepentingan terbaik kami untuk meminimumkan jumlah operasi I / O dengan membungkus BufferedReader di sekitar objek FileReader kami :

BufferedReader in = new BufferedReader(fileReader);

5. Kesimpulan

Dalam tutorial ini, kami belajar mengenai konsep asas Pembaca dan bagaimana FileReader menjadikannya mudah untuk melakukan operasi membaca pada fail teks walaupun terdapat beberapa contoh.

Seperti biasa, kod sumber lengkap untuk tutorial terdapat di GitHub.