60 votes

InputStream vs InputStreamReader

Quel est l'avantage d'utiliser InputStream en InputStreamReader ou vice versa.

Voici un exemple de InputStream en action :

InputStream input = new FileInputStream("c:\\data\\input-text.txt");

int data = input.read();
while(data != -1) {
  //do something with data...
  doSomethingWithData(data);

  data = input.read();
}
input.close();

Et voici un exemple d'utilisation de InputStreamReader (évidemment avec l'aide de InputStream) :

InputStream inputStream = new FileInputStream("c:\\data\\input.txt");
Reader      reader      = new InputStreamReader(inputStream);

int data = reader.read();
while(data != -1){
    char theChar = (char) data;
    data = reader.read();
}

reader.close();  

Le lecteur traite-t-il les données d'une manière particulière ?

J'essaie juste de me faire une idée de l'ensemble i/o aspect de données en continu en Java.

2 votes

Notez que c'est généralement une bonne idée de spécifier l'encodage d'un jeu de caractères lors de la construction d'un fichier de type InputStreamReader . Si vous ne le mentionnez pas, il prendra n'importe quel encodage configuré de la bonne manière (si c'est ce que vous voulez, écrivez-le explicitement).

87voto

Jack Points 61503

Ils représentent des choses quelque peu différentes.

El InputStream est la classe ancêtre de toutes les classes possibles ruisseaux d'octets, elle n'est pas utile en soi mais toutes les sous-classes (comme les FileInputStream que vous utilisez) sont parfaits pour traiter les données binaires.

D'autre part, le InputStreamReader (et son père Reader ) sont utilisés spécifiquement pour traiter les caractères (donc les chaînes de caractères), de sorte qu'ils gèrent les encodages charset (utf8, iso-8859-1, etc.) de manière élégante.

La réponse simple est la suivante : si vous avez besoin de données binaires, vous pouvez utiliser un fichier de type InputStream (également un spécifique comme un DataInputStream ), si vous avez besoin de travailler avec du texte, utilisez un fichier InputStreamReader ..

29voto

Trefex Points 1040

Bien InputStreamReader est utilisé pour lire directement les caractères.

Ainsi, les lire en tant que int puis les convertir en char n'est pas vraiment optimal.

C'est la principale différence, je crois.

InputStream vous donne les octets, et le InputStreamReader vous donne déjà des caractères pour qu'il lise le InputStream 8bits à la fois.

En outre, si vous lisez de gros morceaux de texte, vous pouvez même envelopper la balise InputStreamReader dans un BufferedReader qui vous fournit quelques méthodes intéressantes pour, par exemple, lire des lignes entières en une seule fois.

Cela vous aide-t-il ?

Vous pouvez également lire cet article : https://docs.oracle.com/javase/tutorial/essential/io/charstreams.html

A la vôtre,

0 votes

Oui, ça a du sens. Y a-t-il un moyen de spécifier un tampon, de sorte qu'il lise plus d'un octet à la fois - disons par exemple que je veux qu'il lise 1024 octets à la fois.

0 votes

Bonjour, Si vous utilisez BufferedReader, vous pouvez définir la taille du tampon comme indiqué dans la Javadoc "BufferedReader(Reader in, int sz)". Cependant, pour un InputStreamReader, je crois que cela ne permet de lire qu'un octet à la fois. Vous ne pouvez pas changer cela.

12voto

Andreas_D Points 64111

Extrait de la javadoc de InputStreamReader :

Une classe pour transformer un flux d'octets en un flux de caractères. Les données lues à partir du flux d'entrée source sont converties en caractères par un convertisseur de caractères par défaut ou ou un convertisseur de caractères fourni. L'encodage par défaut de encodage par défaut est tiré du fichier propriété système "file.encoding". {@code InputStreamReader} contient un tampon d'octets lus depuis le flux source source et les convertit en caractères caractères si nécessaire.

Pour les InputStreams, qui contiennent réellement des caractères dans un encodage connu, utilisez le lecteur. Sinon, vous ne recevrez que les octets et devrez effectuer la conversion en caractères "à la main".

La différence entre les deux read méthodes :

InputStream::read lit un seul byte et le renvoie sous la forme d'un int tandis que InputStreamReader::read lit un seul char (en respectant l'encodage) et le renvoie sous la forme d'un fichier int .

6voto

Alexander Pogrebnyak Points 24964

Si vous voulez lire des données binaires, utilisez InputStream.

Si vous souhaitez lire des chaînes de caractères à partir d'un flux binaire, utilisez InputStreamReader. L'un de ses constructeurs vous permet de spécifier un jeu de caractères.

Pour cette raison, n'utilisez pas FileReader car il utilise un jeu de caractères par défaut de la plate-forme, ce qui, dans de nombreux cas, n'est pas pratique.

1voto

Asthme Points 561

InputstreamReader est utilisé pour lire les données Unicode que vous ne pouvez pas lire dans l'inputstream.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X