Si l'on veut lire et écrire, non pas des octets, mais des valeurs d'un type connu, il faut utiliser les classes DataInputStream et DataOutputStream . Ces classes disposent de méthodes spécialisées pour divers types de valeurs : readInt(), readDouble(), readChar(), readBoolean(), etc., et les méthodes write...() correspondantes.
On doit connecter un flot de données à un autre flot pour bénéficier de ces méthodes supplémentaires, lors de sa création :
DataOutputStream dos = new DataOutputStream( new FileOutputStream("toto")); ... dos.writeBoolean(true); dos.writeInt(4); dos.close();
On connecte ainsi un flot d'entrée à un autre flot d'entrée, ou un flot de sortie à un autre flot de sortie. Par exemple, pour lire un entier sur l'entrée standard :
DataInputStream dis = new DataInputStream(new FileOutputStream("toto")); int n = dis.readInt();
Le modèle des flots peut être utilisé afin de lire ou d'écrire sur un tableau d'octets. Supposons que l'on dispose d'un tableau d'octets data (reçu par exemple par une communication UDP sur l'Internet). La classe ByteArrayInputStream permet de construire un flot de lecture à partir de ce tableau data.
byte[] data = ...; ByteArrayInputStream in = new ByteArrayInputStream(data);
Si l'on sait qu'un tableau d'octets contient la représentation d'un booléen et d'un entier, on doit le lire à l'aide des méthodes déclarées dans DataInput. On ajoute ces fonctionnalités par décoration du flot, à l'aide du constructeur DataInputStream :
byte[] data = ...; DataInputStream dis = new DataInputStream( new ByteArrayInputStream(data)); boolean b = dis.readBoolean(); int n = dis.readInt(); dis.close();
Ceci suppose que ce tableau contient des données codées de façon compatible avec le décodage réalisé par les méthodes readBoolean(), etc. Ce sera le cas, symétriquement, si le tableau d'octets a été obtenu par les classes DataOutputStream et ByteArrayOutputStream :
byte[] data; ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeBoolean(true); dos.writeInt(4); data = baos.toByteArray(); dos.close();
De même, la classe StringReader permet de construire un flot de lecture à partir d'une chaîne de caractères :
String s = ...; StringReader in = new StringReader(s);