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éthode | Description |
|---|---|
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
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
int data = input.read();
while(data != -1) {
System.out.print((char)data);
data = input.read();
}
input.close();
Lire un tableau d'octets
Exemple
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
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
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
byte[] buffer = new byte[1024];
int bytesRead = input.read(buffer, 10, 500); // Stocker à partir de buffer
input.close();
Ignorer des octets
Exemple
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
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
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
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
// 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
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