ホームページ  >  記事  >  Java  >  Java でテキスト ファイルの最後の行を効率的に取得するにはどうすればよいですか?

Java でテキスト ファイルの最後の行を効率的に取得するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-07 00:18:02122ブラウズ

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

Java でテキスト ファイルの最後の行を効率的に取得する

大きなテキスト ファイルの最後の行を読み取るのは、特にロードを避けようとする場合、困難な作業になることがあります。ファイル全体をメモリに格納します。この記事では、ファイル全体を走査することなくこのタスクを実行する 2 つの効率的な方法について説明します。

方法 1: ファイルのテーリング

最初の方法は、「テーリング」として知られています。 ," では、ファイルの末尾に位置を決めて 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 行の末尾

2 番目のメソッドは、ファイルの最後の 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。