Maison >Java >javaDidacticiel >Comment récupérer efficacement les dernières lignes d'un fichier texte en Java ?

Comment récupérer efficacement les dernières lignes d'un fichier texte en Java ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-07 00:18:02198parcourir

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

Récupérer efficacement les dernières lignes d'un fichier texte en Java

La lecture de la dernière ligne d'un gros fichier texte peut être une tâche difficile, surtout lorsque l'on tente d'éviter le chargement le fichier entier en mémoire. Cet article explore deux méthodes efficaces qui accomplissent cette tâche sans nécessiter de parcourir l'intégralité du fichier.

Méthode 1 : suivre le fichier

La première méthode, connue sous le nom de « suivi ," implique un positionnement à la fin du fichier et une itération en arrière caractère par caractère, en enregistrant les caractères jusqu'à ce qu'un saut de ligne soit rencontré. Cette approche est efficace car elle ne nécessite de traiter qu'une partie du fichier. La fonction Java suivante implémente cette méthode :

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

Méthode 2 : suivre N lignes

La deuxième méthode étend la première en renvoyant les N dernières lignes du fichier . Elle fonctionne de manière similaire à la méthode de queue mais compte les sauts de ligne pour déterminer le nombre de lignes souhaité à récupérer. La fonction Java suivante implémente cette méthode :

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

Usage

Ces méthodes peuvent être invoquées pour récupérer la dernière ligne ou les N dernières lignes d'un gros fichier texte . Par exemple, considérons l'utilisation suivante :

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

Attention

Notez que cette approche peut ne pas gérer correctement tous les caractères Unicode en raison de l'inversion des caractères composés lors de l'inversion. . Reportez-vous à l'article lié pour plus d'informations sur ce problème potentiel.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn