Classe Java InputStream

InputStream est une classe de base abstraite dans le système d'E/S de Java pour lire des données d'octets, située dansjava.iole package.

InputStream est la classe parente de tous les flux d'entrée d'octets, fournissant un cadre de base pour la lecture de données d'octets.

InputStream est une classe abstraite, ce qui signifie que vous ne pouvez pas l'instancier directement, mais vous pouvez créer des objets de flux d'entrée concrets via ses sous-classes (telles que FileInputStream, ByteArrayInputStream, etc.).


Analyse des méthodes principales

InputStream fait partie des flux IO de Java, utilisé pour lire des données en octets (8 bits).

InputStream convient au traitement de données non textuelles, telles que des images, de l'audio, de la vidéo, des fichiers compressés, etc.

Vous pouvez le voir comme un « tuyau d'eau », où les données circulent de la source vers votre programme comme de l'eau.

Méthodes principales

Nom de la méthodeDescription
int read()Lit un octet, la valeur de retour est un int de 0 à 255, renvoie si la fin du flux est atteinte-1
int read(byte[] b)Lit au plus depuis le fluxb.lengthoctets de données et les stocke dans un tableau d'octetsb
int read(byte[] b, int off, int len)fromoffLit au plus à partir de la position de décalagelenoctets dans le tableaub
void close()Ferme le flux et libère les ressources associées

Lire un seul octet

public abstract int read() throws IOException

Il s'agit de la méthode la plus élémentaire d'InputStream, utilisée pour lire l'octet suivant des données depuis le flux d'entrée. La valeur de retour est un int entre 0 et 255, et -1 est renvoyé si la fin du flux est atteinte.

Exemple de code

Exemple

InputStream input = new FileInputStream("example.txt");
int data = input.read();
while(data != -1) {
    System.out.print((char)data);
    data = input.read();
}
input.close();

Lire un tableau d'octets

Exemple

public int read(byte[] b) throws IOException

Cette méthode tente de lire jusqu'à b.length octets de données dans un tableau d'octets, en renvoyant le nombre réel d'octets lus, ou -1 si la fin du flux est atteinte.

Exemple de code

Exemple

InputStream input = new FileInputStream("example.txt");
byte[] buffer = new byte[1024];
int bytesRead;
while((bytesRead = input.read(buffer)) != -1) {
    System.out.println("Lecture de " + bytesRead + " octets");
}
input.close();

, lire jusqu'à 500 octets

Exemple

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

Cette méthode vous permet de spécifier la position (off) à partir de laquelle commencer à stocker les données lues, et le nombre maximal d'octets (len) à lire.

Exemple de code

Exemple

InputStream input = new FileInputStream("example.txt");
byte[] buffer = new byte[1024];
int bytesRead = input.read(buffer, 10, 500); // Stocker à partir de buffer
input.close();

Ignorer des octets

Exemple

public long skip(long n) throws IOException

Ignore et supprime n octets de données dans le flux d'entrée, en renvoyant le nombre réel d'octets ignorés.

Vérifier les octets disponibles

Exemple

public int available() throws IOException

Renvoie une estimation du nombre d'octets pouvant être lus (ou ignorés) depuis ce flux d'entrée sans blocage.

2.6 Fermer le flux

Exemple

public void close() throws IOException

Ferme le flux d'entrée et libère toutes les ressources système qui lui sont associées. Il s'agit d'une méthode très importante et elle doit être appelée après avoir terminé les opérations sur le flux.


Introduction aux sous-classes courantes

  • FileInputStream: Utilisé pour lire des données à partir de fichiers.
  • ByteArrayInputStream: Permet d'utiliser un tableau d'octets en mémoire comme flux d'entrée.
  • FilterInputStream: Une classe décorateur qui fournit des fonctionnalités supplémentaires aux autres flux d'entrée.
  • ObjectInputStream: Utilisé pour désérialiser des objets précédemment sérialisés avec ObjectOutputStream.
  • PipedInputStream: Utilisé conjointement avec PipedOutputStream pour implémenter une communication par tube entre les threads.

Bonnes pratiques

Utiliser try-with-resources

Java 7 a introduit l'instruction try-with-resources, qui peut fermer automatiquement les ressources qui implémentent l'interface AutoCloseable.

Exemple

try (InputStream input = new FileInputStream("example.txt")) {
    int data;
    while ((data = input.read()) != -1) {
        System.out.print((char)data);
    }
} catch (IOException e) {
    e.printStackTrace();
}

Lecture tamponnée pour de meilleures performances

Pour les fichiers volumineux ou les opérations de lecture fréquentes, il est recommandé d’envelopper le flux avec un BufferedInputStream pour améliorer les performances.

Exemple

try (InputStream input = new BufferedInputStream(new FileInputStream("largefile.dat"))) {
    // Opération de lecture
} catch (IOException e) {
    e.printStackTrace();
}

Gérer correctement les exceptions

Les opérations d’E/S peuvent lever une IOException, et ces exceptions doivent être correctement gérées.


5. FAQ

Pourquoi la méthode read() renvoie-t-elle un int au lieu d’un byte ?

Parce qu’une valeur spéciale (-1) est nécessaire pour indiquer la fin du flux, et que le type byte ne peut pas représenter -1.

Comment convertir un InputStream en String ?

Exemple

public static String convertToString(InputStream input) throws IOException {
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(input))) {
        StringBuilder stringBuilder = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            stringBuilder.append(line);
        }
        return stringBuilder.toString();
    }
}

Comment copier InputStream ?

InputStream ne peut généralement être lu qu'une seule fois. Si plusieurs lectures sont nécessaires, vous pouvez copier son contenu dans un tableau d'octets ou un ByteArrayInputStream.


6. Résumé

La classe InputStream est l'un des composants essentiels du système Java I/O, offrant des fonctionnalités de base pour la lecture de données d'octets. Comprendre InputStream et ses sous-classes est crucial pour gérer diverses sources d'entrée (telles que des fichiers, des connexions réseau, des tampons mémoire, etc.). Dans les applications pratiques, une attention particulière doit être portée à la gestion des ressources, à la gestion des exceptions et à l'optimisation des performances.

Autres extensions