Java Language
InputStreams et OutputStreams
Recherche…
Syntaxe
- int read (octet [] b) lève une exception IOException
Remarques
Notez que la plupart du temps, vous n'utilisez PAS directement InputStream
mais utilisez BufferedStream
, ou similaire. En effet, InputStream
lit à partir de la source chaque fois que la méthode de lecture est appelée. Cela peut entraîner une utilisation importante du processeur dans les changements de contexte du noyau.
Lecture de InputStream dans une chaîne
Parfois, vous souhaiterez peut-être lire des octets dans une chaîne. Pour ce faire , vous aurez besoin de trouver quelque chose qui convertit entre byte
et UTF-16 Codepoints « Java natif » utilisé comme char
. Cela se fait avec un InputStreamReader
.
Pour accélérer le processus un peu, il est "habituel" d'allouer un tampon, afin de ne pas avoir trop de temps lors de la lecture de Input.
public String inputStreamToString(InputStream inputStream) throws Exception {
StringWriter writer = new StringWriter();
char[] buffer = new char[1024];
try (Reader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"))) {
int n;
while ((n = reader.read(buffer)) != -1) {
// all this code does is redirect the output of `reader` to `writer` in
// 1024 byte chunks
writer.write(buffer, 0, n);
}
}
return writer.toString();
}
Transformer cet exemple en code Java SE 6 (et inférieur) est omis comme exercice pour le lecteur.
Écrire des octets dans un OutputStream
Écrire des octets dans un OutputStream
un octet à la fois
OutputStream stream = object.getOutputStream();
byte b = 0x00;
stream.write( b );
Ecrire un tableau d'octets
byte[] bytes = new byte[] { 0x00, 0x00 };
stream.write( bytes );
Écrire une section d'un tableau d'octets
int offset = 1;
int length = 2;
byte[] bytes = new byte[] { 0xFF, 0x00, 0x00, 0xFF };
stream.write( bytes, offset, length );
Fermeture des cours d'eau
La plupart des flux doivent être fermés lorsque vous en avez terminé, sinon vous pourriez introduire une fuite de mémoire ou laisser un fichier ouvert. Il est important que les flux soient fermés même si une exception est levée.
try(FileWriter fw = new FileWriter("outfilename");
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter out = new PrintWriter(bw))
{
out.println("the text");
//more code
out.println("more text");
//more code
} catch (IOException e) {
//handle this however you
}
N'oubliez pas: try-with-resources garantit que les ressources ont été fermées à la sortie du bloc, que cela se produise avec le flux de contrôle habituel ou à cause d'une exception.
Parfois, try-with-resources n'est pas une option, ou vous supportez peut-être une version antérieure de Java 6 ou antérieure. Dans ce cas, la manipulation est d'utiliser un finally
bloc:
FileWriter fw = null;
BufferedWriter bw = null;
PrintWriter out = null;
try {
fw = new FileWriter("myfile.txt");
bw = new BufferedWriter(fw);
out = new PrintWriter(bw);
out.println("the text");
out.close();
} catch (IOException e) {
//handle this however you want
}
finally {
try {
if(out != null)
out.close();
} catch (IOException e) {
//typically not much you can do here...
}
}
Notez que la fermeture d'un flux d'encapsuleur fermera également son flux sous-jacent. Cela signifie que vous ne pouvez pas envelopper un flux, fermer le wrapper, puis continuer à utiliser le flux d'origine.
Copier le flux d'entrée vers le flux de sortie
Cette fonction copie les données entre deux flux -
void copy(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[8192];
while ((bytesRead = in.read(buffer)) > 0) {
out.write(buffer, 0, bytesRead);
}
}
Exemple -
// reading from System.in and writing to System.out
copy(System.in, System.out);
Emballage des flux d'entrée / sortie
OutputStream
et InputStream
ont de nombreuses classes différentes, chacune avec une fonctionnalité unique. En encapsulant un flux autour d'un autre, vous obtenez la fonctionnalité des deux flux.
Vous pouvez envelopper un flux autant de fois que vous le souhaitez, prenez simplement en note la commande.
Combinaisons utiles
Écrire des caractères dans un fichier en utilisant un tampon
File myFile = new File("targetFile.txt");
PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream(myFile)));
Compression et cryptage des données avant l'écriture dans un fichier lors de l'utilisation d'un tampon
Cipher cipher = ... // Initialize cipher
File myFile = new File("targetFile.enc");
BufferedOutputStream outputStream = new BufferedOutputStream(new DeflaterOutputStream(new CipherOutputStream(new FileOutputStream(myFile), cipher)));
Liste des wrappers de flux d'entrée / sortie
Emballage | La description |
---|---|
BufferedOutputStream / BufferedInputStream | Alors que OutputStream écrit des données un octet à la fois, BufferedOutputStream écrit les données en blocs. Cela réduit le nombre d'appels système, améliorant ainsi les performances. |
DeflaterOutputStream / DeflaterInputStream | Effectue la compression des données. |
InflaterOutputStream / InflaterInputStream | Effectue la décompression des données. |
CipherOutputStream / CipherInputStream | Crypte / Décrypte les données. |
DigestOutputStream / DigestInputStream | Génère Message Digest pour vérifier l'intégrité des données. |
CheckedOutputStream / CheckedInputStream | Génère un CheckSum. CheckSum est une version plus triviale de Message Digest. |
DataOutputStream / DataInputStream | Permet d'écrire des types de données primitifs et des chaînes. Conçu pour écrire des octets. Plate-forme indépendante. |
PrintStream | Permet d'écrire des types de données primitifs et des chaînes. Conçu pour écrire des octets. Plate-forme dépendante. |
OutputStreamWriter | Convertit un OutputStream en un écrivain. Un OutputStream traite les octets pendant que Writers traite les caractères |
PrintWriter | Appelle automatiquement OutputStreamWriter. Permet d'écrire des types de données primitifs et des chaînes. Strictement pour écrire des caractères et mieux pour écrire des caractères |
Exemple DataInputStream
package com.streams;
import java.io.*;
public class DataStreamDemo {
public static void main(String[] args) throws IOException {
InputStream input = new FileInputStream("D:\\datastreamdemo.txt");
DataInputStream inst = new DataInputStream(input);
int count = input.available();
byte[] arr = new byte[count];
inst.read(arr);
for (byte byt : arr) {
char ki = (char) byt;
System.out.print(ki+"-");
}
}
}