Adloun

programmation Java (école d'ingénieur) · Chapitre 14 · Application directe du cours

Lire ce que l'on comprend

Fichiers et flux · niveau 1 (application)

Énoncé

Répondre en une ou deux phrases.

  • Pourquoi est-il déconseillé d'appeler Files.readAllLines sur un fichier journal de 20 gigaoctets ?
  • Un programme écrit un rapport avec un PrintWriter mais oublie de le fermer. Le fichier obtenu est vide. Pourquoi ?
  • Pourquoi faut-il attraper NoSuchFileException avant IOException dans une suite de catch ?
  • Le programme java Notes lancé depuis le dossier /home/eleve ne trouve pas notes.csv, qui est pourtant dans /home/eleve/tp4, à côté de Notes.class. Pourquoi, et comment corriger ?

Corrigé

  • readAllLines charge tout le fichier en mémoire, dans une liste de chaînes : 20 gigaoctets de texte occupent bien plus de 20 gigaoctets en mémoire Java, ce qui dépasse la mémoire disponible (OutOfMemoryError). Il faut lire ligne par ligne, ou avec Files.lines.
  • Le PrintWriter écrit dans un tampon en mémoire, qui n'est vidé sur le disque que lorsqu'il est plein ou lorsque l'on ferme le flux. Un petit rapport tient entièrement dans le tampon : sans close (ou try-avec-ressources), rien n'est écrit.
  • NoSuchFileException est une sous-classe d'IOException. Les catch sont examinés dans l'ordre : si IOException venait en premier, il attraperait tout, et le second serait inaccessible ; le compilateur refuse d'ailleurs ce code : error: exception NoSuchFileException has already been caught.
  • Un chemin relatif se lit à partir du dossier courant, ici /home/eleve, et non du dossier du fichier .class. Il faut se placer dans tp4 avant de lancer le programme (cd tp4, puis java Notes), ou donner le chemin tp4/notes.csv.

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →