1. Présentation
Ce tutoriel montrera comment lire efficacement les fichiers volumineux en Java. Java - Retour aux bases.
2. Lire en mémoire
La façon standard de lire les lignes de fichiers est de lire en mémoire. Guava et Apachecommonsio fournissent des méthodes pour lire rapidement les lignes de fichiers comme suit:
Files.readLines(new File(path), Charsets.UTF_8);
FileUtils.readLines(new File(path));
Le problème avec cette méthode est que toutes les lignes du fichier sont stockées en mémoire, et lorsque le fichier est suffisamment grand, il amènera rapidement le programme à lancer une exception OutOfMemoryError.
Par exemple: lisez un fichier d'environ 1g:
@TestPublic void donné donné par UOVA_WHENITERATINAGAFILE_THENWORKS () lève ioException {String path = ... files.readlines (nouveau fichier (path), charsets.utf_8);}Cette méthode ne prend qu'une petite quantité de mémoire au début: (elle consomme environ 0 Mo de mémoire)
[Main] Info org.baeldung.java.corejavaiounitSest - Mémoire totale: 128 Mo [Main] Info org.baeldung.java.corejavaiounitst - Mémoire libre: 116 MB
Cependant, lorsque tous les fichiers sont lus dans la mémoire, nous pouvons enfin voir (environ 2 Go de mémoire sont consommés):
[Main] Info org.baeldung.java.corejavaiounitSest - Mémoire totale: 2666 Mo [Main] Info org.baeldung.java.corejavaiounittest - Mémoire libre: 490 MB
Cela signifie que ce processus consomme environ 2,1 Go de mémoire - la raison est simple: maintenant toutes les lignes du fichier sont stockées en mémoire.
Mettre tous les contenus d'un fichier en mémoire manquera rapidement de la mémoire disponible - quelle que soit la taille de la mémoire disponible, cela est évident.
De plus, nous n'avons généralement pas besoin de mettre toutes les lignes du fichier en mémoire à la fois - nous avons plutôt besoin de traverser chaque ligne du fichier, puis de faire le traitement correspondant et de le jeter après le traitement. Donc, c'est exactement ce que nous allons faire - parcourez les lignes, au lieu de mettre toutes les lignes en mémoire.
3. flux de fichiers
Examinons maintenant cette solution - nous utiliserons la classe java.util.scanner pour scanner le contenu du fichier et le lire en continu ligne par ligne:
FileInputStream inputStream = null; scanner sc = null; try {inputStream = new FileInputStream (path); SC = nouveau scanner (InputStream, "UTF-8"); while (sc.hasnextline ()) {String line = sc.nextline (); // System.out.println (ligne); } // Notez que le scanner supprime les exceptions if (sc.ioException ()! = null) {throw sc.ioException (); }} enfin {if (inputStream! = null) {inputStream.close (); } if (sc! = null) {sc.close (); }}Cette solution traversera toutes les lignes dans le fichier - permettant à chaque ligne d'être traitée sans y tenir une référence. Quoi qu'il en soit, ils n'étaient pas stockés en mémoire: (environ 150 Mo de mémoire a été consommé)
[Main] inoorg.baeldung.java.corejavaiounittest-totalmemory: 763mb
[Main] inoorg.baeldung.java.corejavaiouttest-freememory: 605Mb
4. Stream Apachecommonsio
Vous pouvez également utiliser la bibliothèque Commonsio pour l'implémenter, en utilisant le lineiterator personnalisé fourni par la bibliothèque:
Lineiterator it = fileutils.lineiterator (thefile, "utf-8"); try {while (it.hasnext ()) {string line = it.nextline (); // faire quelque chose avec la ligne}} enfin {lineiterator.closequietly (it);}Étant donné que l'ensemble du fichier n'est pas stocké en mémoire, cela conduit à une consommation de mémoire plutôt conservatrice: (environ 150 Mo de mémoire est consommée)
[Main] Infoo.b.java.corejavaiontegrationtest-totalmemory: 752MB
[Main] infoo.b.java.corejavaiointegrationtest-freeememory: 564Mb
5. Conclusion
Ce court article décrit comment traiter les fichiers volumineux sans lecture répétée et manquer de mémoire - cela fournit une solution utile pour traiter les fichiers volumineux.
Tous ces exemples sont implémentés et des extraits de code disponibles sur mon projet GitHub - il s'agit d'un projet basé sur Eclipse, il doit donc être facilement importé et exécuté.
Ce qui précède est tout le contenu de cet article sur la lecture efficace de Java des fichiers volumineux. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!