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.

Java SE 7
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.

Java SE 7
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.

Java SE 6

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+"-");  
    }  
  }  
}


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow