Maison > Java > javaDidacticiel > le corps du texte

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

Susan Sarandon
Libérer: 2024-11-07 00:18:02
original
121 Les gens l'ont consulté

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;
  }
}
Copier après la connexion

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;
  }
}
Copier après la connexion

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));
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!