Les entrées et sorties en Java

Patrick Gros et Pierrick Gaudry


Sorties sur l'écran

Pour écrire des choses à l'écran, deux possibilités :

Entrées au clavier

Pour demander à l'utilisateur de rentrer des données au clavier dans un programme, il faut partir de l'objet de base System.in.
À partir de cet objet, on crée un premier objet de type InputStreamReader, objet qui ne permet que de lire des caractères un par un :
InputStreamReader ist = new InputStreamReader(System.in) ;

À partir de ce nouvel objet, on en crée un autre de type BufferedReader qui permet de lire des lignes entières de texte :
BufferedReader br = new BufferedReader(ist) ;
String ligne = br.readLine() ;

On peut alors récupérer séparement les mots qui compose cette lignes (qui sont séparés par des espaces ou des tabulations), en créant un objet de type StringTokenizer :
StringTokenizer st = new StringTokenizer(ligne) ;
La fonction st.hasMoreTokens() renvoie un booléen et permet de savoir s'ils y a encore des mots non lus sur la ligne, et la fonction st.nextToken() renvoie un objet de type String qui est le prochain mot non encore lu.

Si l'on veut transformer un mot en un entier ou un réel, il faut faire des conversions de type.

Quelques exemples a copier tels quels ou à modifier :

On peut bien sûr combiner ces techniques :

Les opérations d'entrées peuvent provoquer des erreurs. Il faut indiquer à Java que faire dans ce cas. Cela se fait en englobant les opérations d'entrées par try { au début, et à la fin :
}catch(java.io.IOException e) {
   System.out.println("Erreur de lecture") ;
   System.exit(0) ;
}
À la place du message d'erreur, on peut mettre un comportement par défaut (la variable iqui aurait sue être lue peut être mise à zéro) :
try {
.........
} catch(java.io.IOException e) {
   i = 0 ;
}

Entrées et sorties utilisant des fichiers

Lire des données dans un fichier

Les entrées depuis un fichier sont très semblables aux entrées depuis le clavier. Seule différence, on ne part pas de System.in, mais du nom du fichier, à partir duquel on va créer un objet FileReader (à la place de InputStreamReader).
On va alors comme pour le clavier créer un objet BufferedReader et la suite ne change pas :

String nom_fichier = "mon_fichier_dans_lequel_je_veux_lire_des_données" ;
FileReader fichier = new FileReader(nom_fichier) ;
BufferedReader br = new BufferedReader(fichier) ;
.....

Écrire des données dans un fichier

Pour écrire dans un fichier, il faut ouvrir un fichier en écriture en créant un objet de type FileWriter, on peut alors écrire des objets de type String dedans (les entiers et réels doivent être convertis en String d'abord), et on ferme le fichier ensuite. Le tout doit être entouré de try et catch pour récupérer les erreurs d'écriture. Par exemple, pour écrire les deux lignes toto et titi dans un fichier :

try {
  FileWriter fichier = new FIleWriter("mon_fichier_ou_je_veux_ecrire") ;
  fichier.write("toto\n") ;
  fichier.write("titi\n") ;
  fichier.close() ;
} catch (java.io.IOException e) {
  System.out.println("Erreur d'ecriture") ;
  System.exit(1) ;
}

On peut trouver un exemple complet qui marche sur poly ou les machines de la salle 35 par exemple en reprenant la classe copy qui est donne ICI.