Lecture efficace de la dernière ligne d'un fichier texte avec Java
La lecture efficace de la dernière ligne d'un fichier texte volumineux est un défi courant dans Programmation Java. La méthode standard de lecture du fichier ligne par ligne n'est pas efficace, car elle nécessite de parcourir l'intégralité du fichier.
Une approche plus efficace consiste à utiliser la classe RandomAccessFile. Cette classe permet un accès aléatoire à un fichier, nous permettant d'accéder directement à la dernière ligne sans parcourir l'intégralité du fichier. Le code suivant illustre cette approche :
public String tail(File file) { RandomAccessFile fileHandler = null; try { fileHandler = new RandomAccessFile(file, "r"); long fileLength = fileHandler.length() - 1; StringBuilder sb = new StringBuilder(); // Start from the last character of the file for (long filePointer = fileLength; filePointer != -1; filePointer--) { fileHandler.seek(filePointer); int readByte = fileHandler.readByte(); // Check for line break if (readByte == 0xA) { if (filePointer == fileLength) { continue; } break; } else if (readByte == 0xD) { if (filePointer == fileLength - 1) { continue; } break; } // Append character to the string builder sb.append((char) readByte); } String lastLine = sb.reverse().toString(); return lastLine; } catch (java.io.FileNotFoundException e) { e.printStackTrace(); return null; } catch (java.io.IOException e) { e.printStackTrace(); return null; } finally { if (fileHandler != null) { try { fileHandler.close(); } catch (IOException e) { /* ignore */ } } } }
Cette méthode renvoie efficacement la dernière ligne du fichier sans charger ni parcourir l'intégralité du fichier.
Cependant, dans de nombreux scénarios, vous devrez peut-être pour lire les N dernières lignes du fichier. Le code suivant montre une méthode qui peut y parvenir :
public String tail2(File file, int lines) { RandomAccessFile fileHandler = null; try { fileHandler = new java.io.RandomAccessFile(file, "r"); long fileLength = fileHandler.length() - 1; StringBuilder sb = new StringBuilder(); int line = 0; // Start from the last character of the file for (long filePointer = fileLength; filePointer != -1; filePointer--) { fileHandler.seek(filePointer); int readByte = fileHandler.readByte(); // Check for line break if (readByte == 0xA) { if (filePointer < fileLength) { line = line + 1; } } else if (readByte == 0xD) { if (filePointer < fileLength - 1) { line = line + 1; } } // Break if the required number of lines have been reached if (line >= lines) { break; } // Append character to the string builder sb.append((char) readByte); } String lastLine = sb.reverse().toString(); return lastLine; } catch (java.io.FileNotFoundException e) { e.printStackTrace(); return null; } catch (java.io.IOException e) { e.printStackTrace(); return null; } finally { if (fileHandler != null) { try { fileHandler.close(); } catch (IOException e) { } } } }
Cette méthode utilise de la même manière la classe RandomAccessFile pour lire efficacement les N dernières lignes du fichier.
Ces méthodes peuvent être invoquées comme suit :
File file = new File("D:\stuff\huge.log"); System.out.println(tail(file)); System.out.println(tail2(file, 10));
Remarque : Ces méthodes peuvent ne pas produire correctement les caractères Unicode en raison de l'inversion, il est donc important de tester minutieusement avec différentes langues.
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!