Mengambil Baris Terakhir Fail Teks dalam Java dengan Cekap
Membaca baris terakhir fail teks besar boleh menjadi tugas yang mencabar, terutamanya apabila cuba mengelakkan pemuatan keseluruhan fail ke dalam ingatan. Artikel ini meneroka dua kaedah cekap yang menyelesaikan tugas ini tanpa memerlukan traversal melalui keseluruhan fail.
Kaedah 1: Tailing the File
Kaedah pertama, dikenali sebagai "tailing ," melibatkan kedudukan pada penghujung fail dan mengulang aksara mengikut aksara, merakam aksara sehingga pemisah baris ditemui. Pendekatan ini cekap kerana ia hanya memerlukan pemprosesan sebahagian daripada fail. Fungsi Java berikut melaksanakan kaedah ini:
public String tail(File file) { try (RandomAccessFile fileHandler = new RandomAccessFile(file, "r")) { long fileLength = fileHandler.length() - 1; StringBuilder sb = new StringBuilder(); for (long filePointer = fileLength; filePointer != -1; filePointer--) { fileHandler.seek(filePointer); int readByte = fileHandler.readByte(); if (readByte == 0xA) { // line break (LF) if (filePointer == fileLength) { continue; } break; } else if (readByte == 0xD) { // carriage return (CR) if (filePointer == fileLength - 1) { continue; } break; } sb.append((char) readByte); } String lastLine = sb.reverse().toString(); return lastLine; } catch (Exception e) { e.printStackTrace(); return null; } }
Kaedah 2: Tailing N Lines
Kaedah kedua memanjangkan yang pertama dengan mengembalikan N baris terakhir fail . Ia beroperasi sama dengan kaedah tailing tetapi mengira pemisah baris untuk menentukan bilangan baris yang dikehendaki untuk diambil. Fungsi Java berikut melaksanakan kaedah ini:
public String tail2(File file, int lines) { try (RandomAccessFile fileHandler = new RandomAccessFile(file, "r")) { long fileLength = fileHandler.length() - 1; StringBuilder sb = new StringBuilder(); int lineCount = 0; for (long filePointer = fileLength; filePointer != -1; filePointer--) { fileHandler.seek(filePointer); int readByte = fileHandler.readByte(); if (readByte == 0xA) { // line break (LF) if (filePointer < fileLength) { lineCount++; } } else if (readByte == 0xD) { // carriage return (CR) if (filePointer < fileLength - 1) { lineCount++; } } if (lineCount >= lines) { break; } sb.append((char) readByte); } String lastLines = sb.reverse().toString(); return lastLines; } catch (Exception e) { e.printStackTrace(); return null; } }
Penggunaan
Kaedah ini boleh digunakan untuk mendapatkan semula baris terakhir atau N baris terakhir fail teks besar . Sebagai contoh, pertimbangkan penggunaan berikut:
File file = new File("D:\stuff\huge.log"); System.out.println(tail(file)); System.out.println(tail2(file, 10));
Awas
Perhatikan bahawa pendekatan ini mungkin tidak mengendalikan semua aksara unikod dengan betul kerana pembalikan aksara majmuk semasa pembalikan . Rujuk artikel yang dipautkan untuk mendapatkan maklumat lanjut tentang potensi isu ini.
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Kembali Baris Terakhir Fail Teks di Java dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!