2種類のデータ
一般的に言えば、2 つの「世界」があります。
ファイル (またはソケット、DB 内の BLOB など) の場合は、常にバイナリ データが最初になります。
そのバイナリ データの一部は、テキスト データとして扱うことができます (これには、 「エンコーディング」または「文字エンコーディング」と呼ばれるものが含まれます)。
バイナリデータ
バイナリデータを処理したいときはいつでも、 InputStream
/OutputStream
クラスを使用する必要があります (通常、Stream
その名前に含まれるすべてのもの)。
そのため、 aFileInputStream
と aがあります。FileOutputStream
これらはファイルから読み書きし、バイナリ データを処理します。
テキストデータ
テキストデータを処理する場合は常にReader
/Writer
クラスを使用する必要があります。
バイナリ データをテキストに (またはその逆に) 変換する必要がある場合は常に、何らかのエンコーディングが必要です (一般的なものは UTF-8、UTF-16、ISO-8859-1 (および関連するもの)、および古き良き US-アスキー)。「幸いなことに」、Java プラットフォームには「デフォルトのプラットフォーム エンコーディング」と呼ばれるものがあり、必要なときにいつでも使用できますが、コードでは指定されていません。
ただし、プラットフォームのデフォルトのエンコーディングは両刃の剣です。
- 操作ごとにエンコーディングを指定する必要がないため、コードの記述が容易になりますが、
- 持っているデータと一致しない可能性があります: プラットフォームのデフォルトのエンコーディングが ISO-8859-1 で、読み取ったファイルが実際に UTF-8 である場合、スクランブルされた出力が得られます!
BufferedReader
読むために、他のものにラップすることができReader
、行全体を一度に処理する機能を追加することについても言及する必要があります。
Scanner
テキスト入力をトークンに解析するための特別なクラスです。これは構造化テキストに最も役立ちますがSystem.in
、stdin (つまり、ユーザーがキーボードで入力したもの) からデータを読み取るための非常に簡単な方法を提供するためによく使用されます。
ギャップを埋める
さて、紛らわしいことに、これらの世界を橋渡しするクラスがあり、通常、名前には両方の部分が含まれています。
- anはaを
InputStreamReader
消費し、それ自体が aです。InputStream
Reader
- an
OutputStreamWriter
は a Writer
であり、 anに書き込みますOutputStream
。
そして、よく組み合わせられる他の 2 つのクラスを基本的に組み合わせた「ショートカット クラス」があります。
- a
FileReader
は基本的に a と a の組み合わせFileInputStream
ですInputStreamReader
- a
FileWriter
は基本的に a と a の組み合わせFileOutputStream
ですOutputStreamWriter
FileReader
とFileWriter
には、より複雑な「手作り」の代替手段と比較して大きな欠点があることに注意してください。これらは常にプラットフォームのデフォルトのエンコーディングを使用しますが、これはあなたがしようとしているものではないかもしれません!
シリアライズのこと?
ObjectOutputStream
およびObjectInputStream
は、シリアル化に使用される特別なストリームです。
クラスの名前が示すように、シリアル化には (オブジェクトのシリアル化であってもString
) バイナリ データのみが含まれるため、クラスのみを使用する必要があります*Stream
。Reader
/Writer
クラスを避ける限り、問題はありません。
その他のリソース