Lire et écrire des flux d'octets

Sommaire du document

Java nous permet de manipuler différents types de flux de données. Nous allons ici voir les “byte streams”[1], que nous pouvons diviser comme suit :

  • Les “Data Sink Streams”[2], qui permettent simplement de lire ou écrire via des flux.
    • “Memory streams”[3], qui permettent de manipuler les données de la mémoire.
    • “File Streams”[4], qui permettent les opérations de lecture/écriture sur des fichiers.
    • “Piped Streams”[5], qui permettent les échanges d'informations entre threads.
  • Les Processing streams, qui permettent d'effectuer des traitements spécifiques (“buffering”, encodage,etc.).

java.io.InputStream et java.io.OutputStream sont des classes abstraites, qui proposent des méthodes concrètes et des méthodes abstraites dont les sous-classes proposent des implémentations. Nous utiliserons donc souvent ces deux classes pour ne pas nous tracasser de savoir à quelle instance réelle nous utilisons.

 

Conversions de flux

Java nous offre certaines possibilités de conversions entre les types de flux :
Pour passer d'un ByteStream vers un CharacterStream, nous disposons de la classe java.io.InputStreamReader (dans la hiérarchie de java.io.Reader).
Pour passer d'un CharacterStream vers un ByteStream, nous disposons de la classe java.io.OutputStreamWriter (dans la hiérarchie de java.io.Writer).

 

Entrées/sorties standards

Les entrées-sortie standards sont des flots d'octets. Il sont accessibles comme des membres statiques (in, out et err) de la classe java.lang.System.

Par exemple, nous pouvons maintenir dans des variables les flux standards afin de les rétablir après les avoir redirigés le temps d'effectuer certaines opérations :

  1. InputStream stdin = System.in;
  2. OutputStream stdout = System.out;

 

InputStream

La classe abstraite InputStream possède une méthode abstraite read qui nous permet de lire un octet.

public abstract int read() throws IOException

Cette méthode nous renvoie la valeur de cet octet sous forme d'entier (int) entre 0 et 255, ou -1 si nous sommes à la fin de la source de données.

Comme la méthode est abstraite, le concepteur d'une classe concrète pour un flux d'entrée pourra surcharger cette méthode afin de la doter des fonctionnalités requises : par exemple, read de InputStream lit un octet dans un fichier.

InputStream propose aussi certaines méthodes concrètes de read, dont la signature varie par le type ou le nombre d'argument en entrée.

public int read(byte[] b) throws IOException

read(byte[] b) lit dans le flot un nombre de b.length octets qui sont placés dans le tableau b. Les octets sont stockés dans le tableau dans l'ordre de lecture, de la première case vers la dernière. Le nombre d'octets effectivement lus est retourné, ou -1 si la fin du flot est atteinte.

public int read(byte[] b, int off, int len) throws IOException

read(byte[] b, int off, int len) est équivalente à la méthode précédente si ce n'est que les octets sont stockés à partir de la case d'indice offset et que le nombre d'octets à lire est len.

MéthodeDescription
int read()lit des données du flux
int read(byte[] b)
read(byte[] b, int off, int len)
long skip(long n) saute un certain nombre d'octets du flux
int available()renvoie le nombre d'octets directement disponibles dans le flux
void mark(int readlimit)marque une position dans le flux
void reset()retourne à une position marquée dans le flux
boolean markSupported()renvoie une valeur booléenne si le flux accepte les méthodes mark et reset.
void close()ferme le flux

 

FilterInputStream

Les classes de filtre sur un flux de données dérivent de la classe FilterInputStream :

Les constructeurs de ces classes de filtres prennent tous en paramètre un objet de classe InputStream. La classe InputStream détermine le flux de données sur lequel les classes de filtres effectuent une lecture avant dde procéder à des traitements supplémentaires. Nous pouvons donc passer en paramètre une instance de n'importe quelle classe qui dérive de InputStream.

C'est de cette manière (peu élégante, mais c'est la seule manière) que nous pouvons filtrer une source de données, et même cumuler les filtres les uns derrière les autres, comme le montre l'exemple suivant :

  1. FileInputStream fs = new FileInputStream("authors.txt");
  2. double d = ds.readDouble();

Le fait de passer un flux existant à un constructeur d'un autre flux est très puissant.

 

OutputStream

public abstract void write() throws IOException

public void write(byte[] b) throws IOException

void write(byte[] b) écrit dans le flot un nombre de b.length octets stockés dans le tableau. L'ordre d'écriture des octets dans le flot est celui du tableau.

public void write(byte[] b, int off, int len) throws IOException

write(byte[] b, int off, int len) a le même comportement que la méthode précédente, mais écrit un nombre len d'octets de b en partant de la case d'indice offset.

MéthodeDescription
void write(int b)écrit vers le flux.
void write(byte[] b)
void write(byte[] b, int off, int len)
void flush()force tout output bufférisé en écriture.
void close()ferme le flux.

 

Réseaux sociaux

Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher les interactions avec les réseaux sociaux sur ces pages.

 

Nuage de mots clés

17 mots clés dont 0 définis manuellement (plus d'information...).

Avertissement

Cette page ne possède pas encore de mots clés manuels, ceci est donc un exemple automatique (les niveaux de pertinence sont fictifs, mais les liens sont valables). Pour tester le nuage avec une page qui contient des mots définis manuellement, vous pouvez cliquer ici.

Vous pouvez modifier vos préférences dans votre profil pour ne plus afficher le nuage de mots clés.

 

Notes

  1.  byte streams : correspond à « flux d'octets” en français

  2.  Data Sink Streams : correspond à « flux collecteur de données” en français

  3.  Memory streams : correspond à « flux mémoire” en français

  4.  File Streams : correspond à « flux de fichiers” en français

  5.  Piped Streams : correspond à « flux chaînés” en français

 

Astuce pour imprimer les couleurs des cellules de tableaux : http://www.gaudry.be/ast-rf-450.html
Aucun commentaire pour cette page

© Ce document issu de l′infobrol est enregistré sous le certificat Cyber PrInterDeposit Digital Numbertection. Enregistrement IDDN n° 5329-460
Document créé le 24/06/05 00:00, dernière modification le Mercredi 28 Juin 2017, 15:26
Source du document imprimé : http:///www.gaudry.be/java-bytestreams.html
St.Gaudry©07.01.02
Outils (masquer)
||
Recherche (afficher)
Recherche :

Utilisateur (masquer)
Apparence (afficher)
Stats (afficher)
15838 documents
455 astuces.
550 niouzes.
3107 definitions.
447 membres.
8121 messages.

Document genere en :
1,75 seconde

Mises à jour :
Mises à jour du site
Citation (masquer)
Quand ce que vous pensez, ce que vous dites et ce que vous faites est en harmonie, le bonheur vous appartient.

Gandhi
 
l'infobrol
Nous sommes le Jeudi 29 Juin 2017, 04:05, toutes les heures sont au format GMT+1.00 Heure, heure d'été (+1)