10

Java ファイル I/O 管理に関する情報源をいくつか読んで、入力操作と出力操作の代替手段が複数あることを知りました。

これらは:

  • BufferedReaderBufferedWriter
  • FileReaderFileWriter
  • FileInputStreamFileOutputStream
  • InputStreamReaderOutputStreamWriter
  • Scannerクラス

これらのうち、テキスト ファイルを管理するための最良の代替手段は何ですか? シリアル化の最良の代替手段は何ですか? Java NIO はそれについて何と言っていますか?

4

1 に答える 1

20

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です。InputStreamReader
  • anOutputStreamWriter は a Writerであり、 anに書き込みますOutputStream

そして、よく組み合わせられる他の 2 つのクラスを基本的に組み合わせた「ショートカット クラス」があります。

  • aFileReaderは基本的に a と a の組み合わせFileInputStreamですInputStreamReader
  • aFileWriterは基本的に a と a の組み合わせFileOutputStreamですOutputStreamWriter

FileReaderFileWriterには、より複雑な「手作り」の代替手段と比較して大きな欠点があることに注意してください。これらは常にプラットフォームのデフォルトのエンコーディングを使用しますが、これはあなたがしようとしているものではないかもしれません!

シリアライズのこと?

ObjectOutputStreamおよびObjectInputStreamは、シリアル化に使用される特別なストリームです。

クラスの名前が示すように、シリアル化には (オブジェクトのシリアル化であってもString) バイナリ データのみが含まれるため、クラスのみを使用する必要があります*StreamReader/Writerクラスを避ける限り、問題はありません。

その他のリソース

于 2013-10-17T14:55:59.697 に答える