Maison  >  Article  >  Java  >  Solution Java au débordement de mémoire lors de la lecture de fichiers volumineux

Solution Java au débordement de mémoire lors de la lecture de fichiers volumineux

黄舟
黄舟original
2017-08-10 09:21:332510parcourir

L'éditeur suivant vous proposera un article qui résout parfaitement le problème de débordement de mémoire lors de la lecture de fichiers volumineux en Java. L'éditeur le trouve plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence pour tout le monde. Suivons l'éditeur et jetons un coup d'œil

1. Méthode traditionnelle : lecture du contenu du fichier en mémoire

Normes de lecture des lignes de fichiers La manière est pour lire en mémoire, Guava et Apache Commons IO fournissent une méthode pour lire rapidement les lignes de fichiers comme suit :


Files.readLines(new File(path), Charsets.UTF_8); 
FileUtils.readLines(new File(path));

utilise en fait BufferedReader ou sa sous-classe LineNumberReader pour lire.

Le problème avec l'approche traditionnelle : est que toutes les lignes du fichier sont stockées en mémoire. Lorsque le fichier est suffisamment volumineux, cela provoquera bientôt le programme. pour lancer une exception OutOfMemoryError.

Réflexion sur le problème : Nous n'avons généralement pas besoin de mettre toutes les lignes du fichier en mémoire à la fois, il nous suffit de les parcourir chacune. ligne du fichier, puis traitez-le en conséquence et jetez-le lorsque vous avez terminé. Nous pouvons donc le lire par itération de ligne au lieu de mettre toutes les lignes en mémoire.

2. Méthode de traitement de lecture de fichiers volumineux

Sans lecture répétée et sans manque de mémoire Traitement des fichiers volumineux :

(1) Méthode de streaming de fichiers : utilisez la classe java.util.Scanner pour analyser le contenu du fichier et lire en continu ligne par ligne


FileInputStream inputStream = null; 
Scanner sc = null; 
try { 
 inputStream = new FileInputStream(path); 
 sc = new Scanner(inputStream, UTF-8); 
 while (sc.hasNextLine()) {
  String line = sc.nextLine(); 
  // System.out.println(line); 
  } 
}catch(IOException e){
  logger.error(e);
}finally {
  if (inputStream != null) { 
  inputStream.close(); 
  } 
  if (sc != null) {
    sc.close();
   }
}

Ce schéma parcourra toutes les lignes du fichier, permettant à chaque ligne d'être traitée sans en conserver une référence. De toute façon, ils ne sont pas stockés en mémoire !

(2) Flux Apache Commons IO : implémenté à l'aide de la bibliothèque Commons IO, 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(); 
 // do something with line 
  } 
} finally {
 LineIterator.closeQuietly(it);
}

Dans cette solution, puisque l'intégralité du fichier n'est pas entièrement stockée dans la mémoire , cela conduit également à une consommation de mémoire assez conservatrice.

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