回答:
java.ioの用途Streams
java.nioの使用中Channels
やbuffer
、java.ioの道とjava.nioの道の間の最も重要な違いがあり、どのようにデータがパッケージ化されたストリームのデータとtransmitted.java.io取引(一度に1バイト)、一方、java.nioはデータをブロックで扱います。ブロックによるデータの処理は、(ストリーミングされた)バイトによる処理よりもはるかに高速ですが、ストリームほど簡単ではありません。
これらの状況では、java.ioの方法を使用することをお勧めします。
これらの状況では、java.nioの方法を使用することをお勧めします。
詳細については、次のリンクを参照してください。
http://www.skill-guru.com/blog/2010/11/14/java-nio-vs-java-io-which-one-to-use/
http://blogs.oracle.com/slc/entry/javanio_vs_javaio
JavaでのファイルI / Oの実際にはどちらが望ましいですか、それはなぜですか?
それは好みよりもむしろ機能の問題であるべきです。
文字指向データ(エンコードとデコードが必要)にはリーダーとライターを、バイト指向データにはInput / OutputStreamsを、データがバイナリデータをエンコードする場合はバイナリストリームを使用します。
文字またはバイト単位でI / Oを行う必要がある場合は、BufferedXxxクラスを使用します。これらは、一度に大量の読み取りと書き込みのシステムコールを行う場合に発生する可能性がある深刻なパフォーマンスの問題を回避する簡単な方法です。
大きなチャンクを読み書きするだけでI / Oを行う場合、BufferedXxxクラスは実際にスループットを少し低下させる可能性があります。プレーンリーダー/ライター/ストリーム(ビッグchar[]
またはbyte[]
バッファー付き)、またはチャネルとXxxBufferのいずれかを使用できます。後者は潜在的に高速ですが、APIはより扱いにくくなっています。
低オーバーヘッドが必要な場合や、複数のストリームからの「選択」、スキャッター/ギャザー、メモリマップファイルアクセスなどの特殊なことを行う場合は、チャネルを使用します。
ご覧のとおり、さまざまなAPIはさまざまな目的で設計されています。一部のユースケースでは重複がありますが、他のユースケースでは1つのAPIのみが目的に適しています。
あるスタイルのI / Oに対して別のスタイルの「優先」を開発する場合の問題は、ソフトウェアの不良につながることです。つまり、I / O効率が必要な場合は非効率的なコード、またはI / O効率が問題にならない場合は過度に複雑なコードのいずれかです。
read
またはwrite
呼び出しのサイズを参照しています。それらがすべてバイト配列からの(十分な)読み取りおよび書き込みである場合、BufferedXxxバッファーをバイパスし、基になるストリームの読み取り/書き込み呼び出しに直接マップします。その特定のケースでは、BufferedXxxラッパーはパフォーマンスに役立ちません。
答えは「状況によります」-バッファリング、ストリーミング、ブロッキング、およびノンブロッキングI / Oはすべて、同時実行性、スループット、その他のパフォーマンス特性に応じて、さまざまな目的で使用されます。