« Nous allons commencer par les flux pour l'entrée/la sortie de fichiers. Mais prenons les choses par le bon bout. »
Il y a deux classes pour lire et écrire des fichiers : FileInputStream et FileOutputStream. Comme tu l'auras probablement déjà deviné, FileInputStream peut lire de manière séquentielle les octets d'un fichier, et FileOutputStream écrire de manière séquentielle des octets dans un fichier. Voici les méthodes que ces classes possèdent :
Méthode | Ce que la méthode fait |
---|---|
|
- Il s'agit du constructeur. Il te permet de spécifier le nom d'un fichier sur le disque, à partir duquel l'objet créé lira les données. |
|
- Cette méthode lit un octet depuis le fichier et le renvoie. La valeur de retour est élargie en int. |
|
- Cette méthode renvoie le nombre d'octets non lus (disponibles). |
|
- Cette méthode « ferme » le flux. Tu peux l'appeler quand tu as fini de travailler avec le flux. L'objet effectue alors les opérations d'entretien nécessaires pour fermer le fichier, etc. À ce stade, tu ne peux plus lire de données à partir du flux. |
Juste pour le plaisir, nous allons calculer la somme de tous les octets dans un fichier. Voici à quoi le code ressemble :
public static void main(String[] args) throws Exception
{
//Create a FileInputStream object bound to «c:/data.txt».
FileInputStream inputStream = new FileInputStream("c:/data.txt");
long sum = 0;
while (inputStream.available() > 0) //as long as there are unread bytes
{
int data = inputStream.read(); //Read the next byte
sum += data; //Add it to the running total
}
inputStream.close(); // Close the stream
System.out.println(sum); // Display the sum on the screen.
}
« Nous avons déjà étudié quelque chose de semblable. Comment est-ce que la classe FileOutputStream est organisée ? »
« Très bien. Regarde ça : »
Méthode | Ce que la méthode fait |
---|---|
|
« Il s'agit du constructeur. Il te permet de spécifier le nom d'un fichier sur le disque, dans lequel l'objet écrira les données. » |
|
« Cette méthode écrit l'octet suivant, en tronquant les données à un octet. » |
|
« Les données à écrire sont souvent d'abord recueillies dans de grands blocs en mémoire, et seulement alors écrites sur le disque. »
La commande flush force l'écriture de toutes les informations non enregistrées sur le disque. |
|
« Cette méthode 'ferme' le flux. Tu peux l'appeler quand tu as fini de travailler avec le flux. » L'objet effectue alors les opérations d'entretien nécessaires pour fermer le fichier, etc. |
Tu ne peux plus écrire des données sur le flux, et la méthode flush est appelée automatiquement.
« C'est tout ? »
« Oui, il n'existe en fait qu'une seule méthode pour l'écriture : write(). Et elle écrit un seul octet à la fois. Mais elle te permet d'écrire autant d'informations que tu veux dans le fichier. »
La programmation est le processus de division d'une tâche vaste et complexe en de nombreux petits éléments. C'est essentiellement le même processus qui se déroule ici : la lecture/écriture de gros blocs de données est divisée en lecture/écriture de petits morceaux d'un octet à la fois.
Voici comment tu peux utiliser ces classes pour copier un fichier sur le disque :
public static void main(String[] args) throws Exception
{
//Create a stream to read bytes from a file
FileInputStream inputStream = new FileInputStream("c:/data.txt");
//Create a stream to write bytes to a file
FileOutputStream outputStream = new FileOutputStream("c:/result.txt");
while (inputStream.available() > 0) //as long as there are unread bytes
{
int data = inputStream.read(); // Read the next byte into the data variable
outputStream.write(data); // and write it to the second stream
}
inputStream.close(); //Close both streams. We don't need them any more.
outputStream.close();
}
« Merci, Rishi. Je comprends enfin comment ce code fonctionne réellement. »
GO TO FULL VERSION