INF1563 Programmation I
Entrées / sorties
Communication du programme avec le monde extérieur
Les opérations de sortie
Où transmettre les résultats ?
- afficher à l'écran
- sauvegarder dans un fichier
- passer comme des entrées à un autre programme
Les opérations d'entrée
Où chercher les données ?
- lire du clavier
- lire d'un fichier
- lire les résultats d'un autre programme
Les opérations d'entrée/sortie en Java suivent le schéma suivant :
- ouverture d'un flux
- lecture ou écriture des données
- fermeture du flux
Il est aussi possible d'accéder aux arguments du programme fournis
à la ligne de commande.
Exemple :
public class AffichageArgs {
public static void main(String args[]) {
for (int i=0; i<args.length; i++){
System.out.println(args[i]);
}
}
}
Le package java.io
- fournit les classes nécessaires à la création, lecture,
écriture et traitement des flux
- en cachant les détails du système d'exploitation
Les flux
Un flux (stream en anglais) permet d'encapsuler le processus d'envoi et de réception de données.
- un flux est un canal de communication à travers duquel il est
possible de lire et écrire des données
- un flux a une source et une destination
- en Java, chaque fichier est un flux d'octets
- l'accès est séquentiel
- tout fichier se termine par une marque de fin de fichier
un programme Java qui traite un flux de données reçoit une indication du système d'exploitation
lorsque la fin du flux est atteinte;
le programme ne connait pas la façon dont le système d'exploitation représente
les fichiers et les fins de fichier
- Java fournit des classes qui permettent de faire des traitements sur les données du flux; ces classes sont associées à un flux de lecture ou d'écriture et sont considérées comme des filtres
Exemple : des filtres qui permettent de mettre les données traitées dans un tampon (buffer) pour les traiter par lots
- trois objets de flux prédéfinis :
System.out
, System.in
et System.err
Classes de gestion des flux
Deux types de flots en Java :
- des caractères : caractères Unicode codés sur 16 bits (l'encodage UTF16)
- des octets : des données binaires codées sur 8 bits
| flux de caractères | flux d'octets |
flux d'entrée | Reader | InputStream |
flux de sortie | Writer | OutputStream |
Les quatre classes dans ce tableau sont abstraites (elles ne peuvent
pas être utilisées directement); elles contiennent plusieurs
sous-classes.
Hiérarchie de classes (incomplète) et exemples de méthodes
Reader
-
- close() : ferme le flux
- int read() : renvoie le caractère
lu ou -1 si la fin du flux est atteinte
- boolean ready() : indique si le flux est prêt à être lu
BufferedReader
: lecture des caractères à
travers un tampon (lecture plus rapide)
- BufferedReader(Reader) : constructeur; le paramètre fourni doit correspondre au flux à lire
- String readLine() : lit une ligne de caractères dans le flux; une ligne est une suite de caractères qui se termine par un retour chariot '\r' ou un saut de ligne '\n' ou les deux
CharArrayReader
: lecture dans un tableau de caractères
InputStreamReader
: permet des traductions entre
flux d’octets et flux de caractères
FileReader
: permet de gérer des flux de
caractères avec des fichiers
- FileReader(String) : constructeur; crée un flux en lecture vers le fichier dont le nom est précisé en paramètre
- FileReader(File) : constructeur; crée un flux en lecture vers le fichier précisé en paramètre
Writer
-
- close() : ferme le flux
- write(String) : écrit la chaîne de caractères en paramètre dans le flux
- write(char[]) : écrit le tableau de caractères en paramètre dans le flux
- write(int) : écrit le caractère en paramètre dans le flux
BufferedWriter
CharArrayWriter
OutputStreamWriter
FileWriter
: permet de gérer des flux de
caractères avec des fichiers
- FileWriter (String) : constructeur; si le nom du fichier précisé n'existe pas alors le fichier sera créé; s'il existe et qu'il contient des données, celles ci seront écrasées
- FileWriter(File) : la même chose mais le fichier est précisé avec un objet de la classe File
OutputStream
FilterOutputStream
PrintStream
:
System.out et System.err sont des objets de PrintStream et correspondent
aux flux d’octets en écriture sur la sortie standard et sur la sortie d'erreur
- print(boolean) : renvoie une chaîne de caractères
étant une représentation textuelle de l'argument
- print(int) : renvoie une chaîne de caractères
étant une représentation textuelle de l'argument
InputStream
-
System.in est un objet de InputStream et correspond
au flux d’octets en lecture sur l'entrée standard
- int read() : renvoie l'octet lu ou -1 si la fin du flux est atteinte
Exemple : lecture d'un fichier texte
import java.io.*;
public class TestBufferedReader {
public static void main(String args[]) {
try {
BufferedReader fichier = new BufferedReader(new FileReader("C:\\test.txt"));
String ligne ;
while ((ligne = fichier.readLine()) != null) {
System.out.println(ligne);
}
fichier.close();
} catch (IOException e) {
System.out.println("Un problème quelque part !");
}
}
}
Exemple : lecture d'un caractère de l'entrée standard
import java.io.*;
public class TestLireCar {
public static void main(String args[]) {
try {
int n = System.in.read();
System.out.println(n);
} catch (IOException e) {
System.out.println("Erreur en lecture");
}
}
}
Exemple : lecture d'une ligne de l'entrée standard
import java.io.*;
public class TestLireLigne {
public static void main(String args[]) {
try {
int fin = (int) '\n';
int n;
while ((n = System.in.read()) != fin)
System.out.print(n + " ");
System.out.println("\nFin" + fin);
} catch (IOException e) {
System.out.println("Erreur en lecture");
}
}
}
abc
97 98 99 13
Fin10