Maison  >  Article  >  Java  >  Comment lire efficacement la dernière ligne d’un fichier texte en Java ?

Comment lire efficacement la dernière ligne d’un fichier texte en Java ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-07 20:15:03607parcourir

How to efficiently read the last line of a text file in Java?

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!

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