Maison > Java > javaDidacticiel > 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
Libérer: 2024-11-07 20:15:03
original
674 Les gens l'ont consulté

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

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

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

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!

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