首页  >  文章  >  Java  >  如何在Java中高效地读取文本文件的最后一行?

如何在Java中高效地读取文本文件的最后一行?

Patricia Arquette
Patricia Arquette原创
2024-11-07 20:15:03667浏览

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

使用 Java 高效读取文本文件的最后一行

高效读取大型文本文件的最后一行是一个常见的挑战Java编程。逐行读取文件的标准方法效率不高,因为它需要迭代整个文件。

更有效的方法是使用 RandomAccessFile 类。此类允许随机访问文件,使我们能够直接访问最后一行,而无需逐步遍历整个文件。以下代码演示了这种方法:

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 */
            }
        }
    }
}

此方法有效地返回文件的最后一行,而无需加载或单步执行整个文件。

但是,在许多情况下,您可能需要读取文件的最后 N 行。以下代码演示了可以实现此目的的方法:

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) {
            }
        }
    }
}

此方法类似地使用 RandomAccessFile 类来有效读取文件的最后 N 行。

这些方法可以调用为如下:

File file = new File("D:\stuff\huge.log");
System.out.println(tail(file));
System.out.println(tail2(file, 10));

注意:这些方法可能由于反转而无法正确生成 Unicode 字符,因此使用不同语言进行彻底测试非常重要。

以上是如何在Java中高效地读取文本文件的最后一行?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn