web-dev-qa-db-ja.com

FileInputStreamと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();

FileReaderFileWriterを使用してmp4ファイルを読み書きすると、output.mp4ファイルを適切にレンダリングできません。しかし、代わりにFileInputStreamFileOutputStreamを使用するとうまくいきました。

FileReaderFileWriterはテキストの読み取りと書き込み専用であると結論付けることはできますか?

40
saravanan

はい、あなたの結論はReaderWriterの正しいサブクラスはテキストコンテンツの読み書きのためです。 InputStream/OutputStreamはバイナリコンテンツ用です。ドキュメントを見ると:

Reader-文字ストリームを読み取るための抽象クラス

InputStream-抽象クラスは、バイトの入力ストリームを表すすべてのクラスのスーパークラスです。

48
Bozho

FileReader(そして確かにanythingReaderを拡張する)は確かにtext用です。 Readerのドキュメント から:

文字ストリームを読み取るための抽象クラス

(Emphasis mine。)APIを見ると、テキストに関係していることがわかります-charではなくbyteが至る所にあります。

InputStreamおよびOutputStreamは、mp4ファイルなどのバイナリデータ用です。

個人的には、システムのデフォルトの文字エンコーディングを常に使用するので、FileReaderは完全に避けます。代わりに、InputStreamReader...の周りにFileInputStreamを使用します。ただし、テキストを処理したい場合のみです。

余談ですが、これは入力から出力にコピーする非常に非効率的な方法です...バッファに読み書きするreadwriteのオーバーロードを使用します-byte[]またはchar[]。それ以外の場合は、ファイル内のすべてのバイト/文字に対して読み取りと書き込みを呼び出しています。

また、また、close IO finallyブロック内のストリームなので、あなたがいる間に例外がスローされても閉じられますそれらを処理します。

29
Jon Skeet

FileInputStreamは、生の画像など、生のデータバイトのストリームを読み取るために使用されます。一方、FileReadersは、文字のストリームの読み取りに使用されます

FileInputStreamFileReaderの違いは、FileInputStreamはファイルをバイト単位で読み取り、FileReaderはファイルを文字単位で読み取ります。

したがって、"Č"FileInputStream値は196 140であるため、文字Čを含むファイルを読み取ろうとすると、ASCIIの結果は268になります。

FileReaderでは、結果が268として返されます。これは、char ČASCII値です。

5
satender

「FileWriterは文字のストリームを書き込むためのものです。生バイトのストリームを書き込む場合は、FileOutputStreamの使用を検討してください。」

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

FileWriterとFileReaderは、文字のストリーム用に設計されています...

宜しくお願いします。

フルカン

1
Furkan

テキストファイルはfileReaderfileInputStreamの両方を使用して読み取ることができますが、mp3とpngはfileInputStreamを使用してのみ読み取ることができます

  1. fileReaderは文字ごとに文字を読み取ります

  2. fileInputStreamはバイト単位で読み取ります

0
IshanGarg