Membaca Garis pada Nombor Garis Diberi Dari Fail di Java

1. Gambaran keseluruhan

Dalam artikel ringkas ini, kita akan melihat pelbagai cara membaca baris pada nombor baris tertentu di dalam fail.

2. Fail Input

Mari mulakan dengan membuat fail sederhana bernama inputLines.txt yang akan kami gunakan dalam semua contoh kami:

Line 1 Line 2 Line 3 Line 4 Line 5

3. Menggunakan BufferedReader

Mari lihat kelas BufferedReader yang terkenal dan kelebihannya tidak menyimpan keseluruhan fail ke dalam memori.

Kita boleh membaca baris demi baris fail dan berhenti apabila kita mahu:

@Test public void givenFile_whenUsingBufferedReader_thenExtractedLineIsCorrect() { try (BufferedReader br = Files.newBufferedReader(Paths.get(FILE_PATH))) { for (int i = 0; i < 3; i++) { br.readLine(); } String extractedLine = br.readLine(); assertEquals("Line 4", extractedLine); } }

4. Menggunakan Pengimbas

Pendekatan serupa yang boleh kita ambil adalah menggunakan Scanner :

@Test public void givenFile_whenUsingScanner_thenExtractedLineIsCorrect() { try (Scanner scanner = new Scanner(new File(FILE_PATH))) { for (int i = 0; i < 3; i++) { scanner.nextLine(); } String extractedLine = scanner.nextLine(); assertEquals("Line 4", extractedLine); } }

Walaupun pada file kecil, perbezaan antara BufferedReader dan Scanner mungkin tidak terlihat, pada file yang lebih besar, Scanner akan lebih lambat kerana juga melakukan parsing dan memiliki ukuran buffer yang lebih kecil.

5. Menggunakan API Fail

5.1. Fail Kecil

Kita boleh menggunakan Files.readAllLines () dari File API untuk membaca isi fail ke dalam memori dengan mudah dan mengeluarkan baris yang kita inginkan:

@Test public void givenSmallFile_whenUsingFilesAPI_thenExtractedLineIsCorrect() { String extractedLine = Files.readAllLines(Paths.get(FILE_PATH)).get(4); assertEquals("Line 5", extractedLine); }

5.2. Fail Besar

Sekiranya kita perlu bekerja dengan fail besar, kita harus menggunakan kaedah baris , yang mengembalikan aliran sehingga kita dapat membaca baris fail demi baris:

@Test public void givenLargeFile_whenUsingFilesAPI_thenExtractedLineIsCorrect() { try (Stream lines = Files.lines(Paths.get(FILE_PATH))) { String extractedLine = lines.skip(4).findFirst().get(); assertEquals("Line 5", extractedLine); } }

6. Menggunakan Apache Commons IO

Pilihan lain adalah menggunakan kelas FileUtils dari pakej commons-io , yang membaca keseluruhan fail dan mengembalikan baris sebagai senarai String s:

@Test public void givenFile_whenUsingFileUtils_thenExtractedLineIsCorrect() { ClassLoader classLoader = getClass().getClassLoader(); File file = new File(classLoader.getResource("linesInput.txt").getFile()); List lines = FileUtils.readLines(file, "UTF-8"); String extractedLine = lines.get(0); assertEquals("Line 1", extractedLine); }

Kami juga dapat menggunakan kelas IOUtils untuk mencapai hasil yang sama, kecuali kali ini, keseluruhan kandungan dikembalikan sebagai String , dan kami harus melakukan pemisahan diri:

@Test public void givenFile_whenUsingIOUtils_thenExtractedLineIsCorrect() { String fileContent = IOUtils.toString(new FileInputStream(FILE_PATH), StandardCharsets.UTF_8); String extractedLine = fileContent.split(System.lineSeparator())[0]; assertEquals("Line 1", extractedLine); }

7. Kesimpulannya

Dalam artikel ringkas ini, kami telah membaca cara yang paling biasa untuk membaca baris pada nombor baris tertentu dari fail.

Seperti biasa, contohnya terdapat di GitHub.