Java Language API Stream vs Writer / Reader


Exemple

Cours d' eau fournissent l'accès le plus direct au contenu binaire, de sorte que toute InputStream / OutputStream implémentations fonctionnent toujours sur int s et byte s.

// Read a single byte from the stream
int b = inputStream.read();
if (b >= 0) { // A negative value represents the end of the stream, normal values are in the range 0 - 255
    // Write the byte to another stream
    outputStream.write(b);
}

// Read a chunk
byte[] data = new byte[1024];
int nBytesRead = inputStream.read(data);
if (nBytesRead >= 0) { // A negative value represents end of stream
    // Write the chunk to another stream
    outputStream.write(data, 0, nBytesRead);
}

Il y a quelques exceptions, notamment le PrintStream qui ajoute la "possibilité d'imprimer facilement des représentations de différentes valeurs de données". Cela permet d'utiliser System.out fois en tant que InputStream binaire et en tant que sortie textuelle en utilisant des méthodes telles que System.out.println() .

En outre, certaines implémentations de flux fonctionnent comme une interface avec des contenus de niveau supérieur tels que les objets Java (voir Sérialisation) ou les types natifs, par exemple DataOutputStream / DataInputStream .

Avec les classes Writer et Reader , Java fournit également une API pour les flux de caractères explicites. Bien que la plupart des applications basent ces implémentations sur des flux, l'API de flux de caractères n'expose aucune méthode pour le contenu binaire.

// This example uses the platform's default charset, see below
// for a better implementation.

Writer writer = new OutputStreamWriter(System.out);
writer.write("Hello world!");

Reader reader = new InputStreamReader(System.in);
char singleCharacter = reader.read();

Chaque fois qu'il est nécessaire d'encoder des caractères en données binaires (par exemple, lors de l'utilisation des classes InputStreamWriter / OutputStreamWriter ), vous devez spécifier un jeu de caractères si vous ne souhaitez pas dépendre du jeu de caractères par défaut de la plate-forme. En cas de doute, utilisez un encodage compatible Unicode, par exemple UTF-8, pris en charge sur toutes les plates-formes Java. Par conséquent, vous devriez probablement rester à l'écart des classes telles que FileWriter et FileReader car celles-ci utilisent toujours le charset de plate-forme par défaut. Une meilleure façon d’accéder aux fichiers en utilisant des flux de caractères est la suivante:

Charset myCharset = StandardCharsets.UTF_8;

Writer writer = new OutputStreamWriter( new FileOutputStream("test.txt"), myCharset );
writer.write('Ä');
writer.flush();
writer.close();

Reader reader = new InputStreamReader( new FileInputStream("test.txt"), myCharset );
char someUnicodeCharacter = reader.read();
reader.close();

L'un des Reader les plus couramment utilisés est BufferedReader qui fournit une méthode permettant de lire des lignes entières de texte à partir d'un autre lecteur. C'est probablement le moyen le plus simple de lire un flux de caractères ligne par ligne:

// Read from baseReader, one line at a time
BufferedReader reader = new BufferedReader( baseReader );
String line;
while((line = reader.readLine()) != null) {
  // Remember: System.out is a stream, not a writer!
  System.out.println(line);
}