首页 >Java >java教程 >如何在 Java 中高效地检索文本文件的最后一行?

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

Susan Sarandon
Susan Sarandon原创
2024-11-07 00:18:02206浏览

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

在 Java 中高效检索文本文件的最后一行

读取大型文本文件的最后一行可能是一项具有挑战性的任务,尤其是在尝试避免加载时整个文件进入内存。本文探讨了两种无需遍历整个文件即可完成此任务的有效方法。

方法 1:拖尾文件

第一种方法,称为“拖尾” ,”涉及定位到文件末尾并逐字符向后迭代,记录字符直到遇到换行符。这种方法非常有效,因为它只需要处理文件的一部分。以下 Java 函数实现此方法:

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;
  }
}

方法 2:拖尾 N 行

第二个方法通过返回文件的最后 N 行来扩展第一个方法。它的操作与拖尾方法类似,但会计算换行符以确定要检索的所需行数。以下 Java 函数实现了此方法:

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;
  }
}

用法

可以调用这些方法来检索大型文本文件的最后一行或最后 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