2014-06-27 3 views
1

J'ai un gros fichier journal sous forme de texte, créé par une application tierce. Malheureusement, mon fichier est de 150 Mo, d'autres peuvent avoir des fichiers encore plus gros, selon le jour où ils ont commencé à se connecter. Étant donné que le fichier est créé par une application tierce, je ne peux pas vraiment le modifier de quelque façon que ce soit (supprimez par exemple son contenu le plus ancien). Ce que je veux faire est garder la trace de la taille du fichier et être averti quand il y a une nouvelle ligne ajoutée (ainsi la taille du fichier est changée) et puis lire cette ligne (ce sera la dernière ligne).Comment suivre les modifications (et les plus importantes) les fichiers vraiment gros en Java efficacement

Je sais quand je veux garder la trace des changements, il ne doit pas être une mise à jour constante, mais lorsque l'utilisateur a réduit l'application dans le bac. Essentiellement, je veux informer l'utilisateur des changements dans l'état de l'application quand il ne peut pas les voir.

Maintenant, je suis suivi les différences dans la taille du fichier à l'aide

File file = new File("filepath"); 
file.length(); 

Pour autant que je comprends cela ne se charge pas le fichier dans la mémoire il est donc pas beaucoup d'une baisse de performance.

Si j'ai raison quel est le moyen le plus efficace pour lire le last line de ce fichier?

Remplacez l'efficacité par "une baisse de performance aussi faible que possible". Cela ne me dérange pas un délai de 2 ou 3 secondes entre l'événement réel étant enregistré dans le fichier et l'utilisateur étant notifié.

Répondre

2

Vous pouvez utiliser DirectoryWatcher pour être averti de la modification d'un répertoire ou d'un fichier. Vous pouvez utiliser RandomAccessFile pour remonter à n'importe quelle position, par ex. où vous lisez jusqu'à la fin par octet, et lisez les octets à partir de ce point. Vous pouvez utiliser la méthode readLine() déconseillée si vous vous souciez particulièrement de l'encodage.

Sinon, je vous suggère de copier des lignes entières dans un tampon, par ex. ByteArrayOutputStream et le décoder en utilisant le bon encodage.

La première raison que vous voulez copier est que vous obtenez des lignes incomplètes ou même des caractères multi-octets incomplets que Bufferedreader ne gère pas particulièrement bien.

Questions connexes