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!