Heim  >  Artikel  >  Java  >  Wie kann ich die letzten Zeilen einer Textdatei in Java effizient abrufen?

Wie kann ich die letzten Zeilen einer Textdatei in Java effizient abrufen?

Susan Sarandon
Susan SarandonOriginal
2024-11-07 00:18:02122Durchsuche

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

Effizientes Abrufen der letzten Zeilen einer Textdatei in Java

Das Lesen der letzten Zeile einer großen Textdatei kann eine herausfordernde Aufgabe sein, insbesondere wenn versucht wird, das Laden zu vermeiden die gesamte Datei in den Speicher. In diesem Artikel werden zwei effiziente Methoden untersucht, die diese Aufgabe erfüllen, ohne dass die gesamte Datei durchlaufen werden muss.

Methode 1: Tailing der Datei

Die erste Methode, bekannt als „Tailing“. „beinhaltet die Positionierung am Ende der Datei und die zeichenweise Rückwärtsiteration, wobei die Zeichen aufgezeichnet werden, bis ein Zeilenumbruch auftritt. Dieser Ansatz ist effizient, da nur ein Teil der Datei verarbeitet werden muss. Die folgende Java-Funktion implementiert diese Methode:

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

Methode 2: Tailing N Lines

Die zweite Methode erweitert die erste, indem sie die letzten N Zeilen der Datei zurückgibt . Sie funktioniert ähnlich wie die Tailing-Methode, zählt jedoch Zeilenumbrüche, um die gewünschte Anzahl der abzurufenden Zeilen zu bestimmen. Die folgende Java-Funktion implementiert diese Methode:

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

Verwendung

Diese Methoden können aufgerufen werden, um die letzte Zeile oder die letzten N Zeilen einer großen Textdatei abzurufen . Betrachten Sie beispielsweise die folgende Verwendung:

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

Vorsicht

Beachten Sie, dass dieser Ansatz aufgrund der Umkehrung zusammengesetzter Zeichen bei der Umkehrung möglicherweise nicht alle Unicode-Zeichen korrekt verarbeitet . Weitere Informationen zu diesem potenziellen Problem finden Sie im verlinkten Artikel.

Das obige ist der detaillierte Inhalt vonWie kann ich die letzten Zeilen einer Textdatei in Java effizient abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn