首頁 > Java > java教程 > 主體

如何在 Java 中有效率地檢索文字檔案的最後一行?

Susan Sarandon
發布: 2024-11-07 00:18:02
原創
121 人瀏覽過

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

在Java 中高效檢索文字檔案的最後一行

讀取大型文字檔案的最後一行可能是一項具有挑戰性的任務,尤其是在嘗試避免載入時整個檔案進入記憶體。本文探討了兩種無需遍歷整個文件即可完成此任務的有效方法。

方法1:拖尾檔案

第一種方法,稱為「拖曳」 ,」涉及定位到檔案結尾並逐字元向後迭代,記錄字元直到遇到換行符。 >

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;
  }
}
登入後複製
第二個方法透過傳回檔案的最後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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!