Rumah  >  Artikel  >  Java  >  Bagaimana untuk Mendapatkan Kembali Baris Terakhir Fail Teks di Java dengan Cekap?

Bagaimana untuk Mendapatkan Kembali Baris Terakhir Fail Teks di Java dengan Cekap?

Susan Sarandon
Susan Sarandonasal
2024-11-07 00:18:02122semak imbas

How to Efficiently Retrieve the Last Lines of a Text File in Java?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn