web-dev-qa-db-fra.com

FileInputStream vs FileReader

FileReader rd=new FileReader("new.mp4");
FileWriter wr=new FileWriter("output.mp4");
int ch;
while((ch=rd.read())!=-1)
  wr.write(ch);

wr.flush();
wr.close();

Lorsque j'utilise les variables FileReader et FileWriter pour lire et écrire un fichier mp4, le fichier output.mp4 ne peut pas être bien rendu. Mais lorsque j’utilise FileInputStream et FileOutputStream à la place, cela a bien fonctionné.

Je peux donc conclure que FileReader et FileWriter servent uniquement à lire et à écrire du texte?

39
saravanan

Oui, votre conclusion est que les sous-classes correctes de Reader et Writer sont destinées à la lecture/écriture de contenu texte. InputStream/OutputStream sont pour le contenu binaire. Si vous regardez la documentation:

Reader - Classe abstraite pour la lecture de flux de caractères

InputStream - La classe abstraite est la superclasse de toutes les classes représentant un flux d'octets en entrée. 

47
Bozho

FileReader (et effectivement n'importe quoi étendre le lecteur) est bien pour texte. De la documentation de Reader :

Classe abstraite pour la lecture de flux de caractères.

(C'est moi qui souligne.) Regardez l'API et vous verrez que tout cela est lié au texte - char au lieu de byte partout.

InputStream et OutputStream sont destinés aux données binaires, telles que les fichiers mp4.

Personnellement, j’éviterais plutôt FileReader car il utilise toujours le codage de caractères par défaut du système. Utilisez plutôt InputStreamReader autour d'une FileInputStream..., mais uniquement lorsque vous souhaitez traiter du texte.

Soit dit en passant, c’est une façon très inefficace de copier d’une entrée à une sortie ... utilisez les surcharges de read et write qui lisent ou écrivent dans un tampon - un byte[] ou un char[]. Sinon, vous appelez lire et écrire pour chaque octet/caractère du fichier.

Vous devez aussi fermer IO dans des blocs finally afin qu'ils soient fermés même si une exception est générée lors de leur traitement.

29
Jon Skeet

FileInputStream est utilisé pour lire des flux d'octets bruts de données, tels que des images brutes. FileReaders, en revanche, sont utilisés pour lire des flux de caractères

La différence entre FileInputStream et FileReader est de, FileInputStream lit le fichier octet par octet et FileReader lit le fichier caractère par caractère.

Ainsi, lorsque vous essayez de lire le fichier contenant le caractère "Č", .__ dans FileInputStream donnera le résultat sous la forme 196 140, car la valeur ASCII de Č est 268.

Dans FileReader donnera le résultat sous la forme 268, qui est la valeur ASCII du caractère Č.

5
satender

"FileWriter est destiné à l'écriture de flux de caractères. Pour l'écriture de flux d'octets bruts, envisagez d'utiliser un FileOutputStream."

http://download.Oracle.com/javase/1.4.2/docs/api/Java/io/FileWriter.html

FileWriter et FileReader sont conçus pour les flux de caractères ...

meilleures salutations.

Furkan

1
Furkan

Un fichier texte peut être lu en utilisant fileReader et fileInputStream, mais les formats mp3 et png ne peuvent être lus qu'en utilisant fileInputStream

  1. fileReader lit caractère par caractère

  2. fileInputStream lit octet par octet

0
IshanGarg