Membaca Baris Terakhir Fail Teks dengan Cekap dengan Java
Membaca baris terakhir fail teks besar dengan cekap adalah cabaran biasa dalam pengaturcaraan Java. Kaedah standard membaca fail baris demi baris tidak cekap, kerana ia memerlukan lelaran melalui keseluruhan fail.
Pendekatan yang lebih cekap ialah menggunakan kelas RandomAccessFile. Kelas ini membenarkan akses rawak kepada fail, membolehkan kami mengakses terus baris terakhir tanpa melangkah ke seluruh fail. Kod berikut menunjukkan pendekatan ini:
public String tail(File file) { RandomAccessFile fileHandler = null; try { fileHandler = new RandomAccessFile(file, "r"); long fileLength = fileHandler.length() - 1; StringBuilder sb = new StringBuilder(); // Start from the last character of the file for (long filePointer = fileLength; filePointer != -1; filePointer--) { fileHandler.seek(filePointer); int readByte = fileHandler.readByte(); // Check for line break if (readByte == 0xA) { if (filePointer == fileLength) { continue; } break; } else if (readByte == 0xD) { if (filePointer == fileLength - 1) { continue; } break; } // Append character to the string builder sb.append((char) readByte); } String lastLine = sb.reverse().toString(); return lastLine; } catch (java.io.FileNotFoundException e) { e.printStackTrace(); return null; } catch (java.io.IOException e) { e.printStackTrace(); return null; } finally { if (fileHandler != null) { try { fileHandler.close(); } catch (IOException e) { /* ignore */ } } } }
Kaedah ini mengembalikan baris terakhir fail dengan cekap tanpa memuatkan atau melangkah ke seluruh fail.
Walau bagaimanapun, dalam banyak senario, anda mungkin perlu untuk membaca N baris terakhir fail. Kod berikut menunjukkan kaedah yang boleh mencapai ini:
public String tail2(File file, int lines) { RandomAccessFile fileHandler = null; try { fileHandler = new java.io.RandomAccessFile(file, "r"); long fileLength = fileHandler.length() - 1; StringBuilder sb = new StringBuilder(); int line = 0; // Start from the last character of the file for (long filePointer = fileLength; filePointer != -1; filePointer--) { fileHandler.seek(filePointer); int readByte = fileHandler.readByte(); // Check for line break if (readByte == 0xA) { if (filePointer < fileLength) { line = line + 1; } } else if (readByte == 0xD) { if (filePointer < fileLength - 1) { line = line + 1; } } // Break if the required number of lines have been reached if (line >= lines) { break; } // Append character to the string builder sb.append((char) readByte); } String lastLine = sb.reverse().toString(); return lastLine; } catch (java.io.FileNotFoundException e) { e.printStackTrace(); return null; } catch (java.io.IOException e) { e.printStackTrace(); return null; } finally { if (fileHandler != null) { try { fileHandler.close(); } catch (IOException e) { } } } }
Kaedah ini juga menggunakan kelas RandomAccessFile untuk membaca N baris terakhir fail dengan cekap.
Kaedah ini boleh digunakan sebagai berikut:
File file = new File("D:\stuff\huge.log"); System.out.println(tail(file)); System.out.println(tail2(file, 10));
Nota: Kaedah ini mungkin tidak menghasilkan aksara Unikod dengan betul kerana pembalikan, jadi adalah penting untuk menguji secara menyeluruh dengan bahasa yang berbeza.
Atas ialah kandungan terperinci Bagaimana untuk cekap membaca baris terakhir fail teks di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!