Rumah  >  Artikel  >  Java  >  Bagaimana untuk cekap membaca baris terakhir fail teks di Jawa?

Bagaimana untuk cekap membaca baris terakhir fail teks di Jawa?

Patricia Arquette
Patricia Arquetteasal
2024-11-07 20:15:03609semak imbas

How to efficiently read the last line of a text file in Java?

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!

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