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.readAllLinessur un fichier journal de 20 gigaoctets ? - Un programme écrit un rapport avec un
PrintWritermais oublie de le fermer. Le fichier obtenu est vide. Pourquoi ? - Pourquoi faut-il attraper
NoSuchFileExceptionavantIOExceptiondans une suite decatch? - Le programme
java Noteslancé depuis le dossier/home/elevene trouve pasnotes.csv, qui est pourtant dans/home/eleve/tp4, à côté deNotes.class. Pourquoi, et comment corriger ?
Corrigé
readAllLinescharge 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 avecFiles.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 : sansclose(ou try-avec-ressources), rien n'est écrit. NoSuchFileExceptionest une sous-classe d'IOException. Lescatchsont examinés dans l'ordre : siIOExceptionvenait 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 danstp4avant de lancer le programme (cd tp4, puisjava Notes), ou donner le chemintp4/notes.csv.
100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.