JavaのファイルI / Oには何が適していますか?[閉まっている]


8

三人のうち

  • BufferedReader / Writer
  • バイナリストリーム
  • チャンネル

  • JavaでのファイルI / Oの現実において どちらがより好ましいのですか?それはなぜですか?
    バイナリデータをファイルに入れたり読み取ったりするためのチャネルと、文字列データ用のBufferedReader / Writerを好みます

    回答:


    18

    java.ioの用途Streamsjava.nioの使用中Channelsbuffer、java.ioの道とjava.nioの道の間の最も重要な違いがあり、どのようにデータがパッケージ化されたストリームのデータとtransmitted.java.io取引(一度に1バイト)、一方、java.nioはデータをブロックで扱います。ブロックによるデータの処理は、(ストリーミングされた)バイトによる処理よりもはるかに高速ですが、ストリームほど簡単ではありません。

    これらの状況では、java.ioの方法を使用することをお勧めします。

    • ファイルは大きくても大きくはない場合があります。ファイル全体をメモリに読み込むことができます。
    • アプリケーションは、同時にいくつかのファイルまたはネットワーク接続のみを読み書きします。理想的には、一度に1つのストリームのみを使用します。
    • アプリケーションは順次です。ファイルの読み取りまたは書き込みが完了するまで、多くのことはできません。

    これらの状況では、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

    https://www.ibm.com/developerworks/java/tutorials/j-nio/

    http://java.dzone.com/articles/java-nio-vs-io


    チャネルはjava.ioストリームよりも簡単です。
    Dummy Derp

    7
    ほとんどの人(私のように)は、nioプログラミングモデルは従来のjava ioよりも複雑であると言っているので、あなたにとっては良いことです。
    Saeed Zarinfam 2012

    4

    JavaでのファイルI / Oの実際にはどちらが望ましいですか、それはなぜですか?

    それは好みよりもむしろ機能の問題であるべきです。

    • 文字指向データ(エンコードとデコードが必要)にはリーダーとライターを、バイト指向データにはInput / OutputStreamsを、データがバイナリデータをエンコードする場合はバイナリストリームを使用します。

    • 文字またはバイト単位でI / Oを行う必要がある場合は、BufferedXxxクラスを使用します。これらは、一度に大量の読み取りと書き込みのシステムコールを行う場合に発生する可能性がある深刻なパフォーマンスの問題を回避する簡単な方法です。

    • 大きなチャンクを読み書きするだけでI / Oを行う場合、BufferedXxxクラスは実際にスループットを少し低下させる可能性があります。プレーンリーダー/ライター/ストリーム(ビッグchar[]またはbyte[]バッファー付き)、またはチャネルとXxxBufferのいずれかを使用できます。後者は潜在的に高速ですが、APIはより扱いにくくなっています。

    • 低オーバーヘッドが必要な場合や、複数のストリームからの「選択」、スキャッター/ギャザー、メモリマップファイルアクセスなどの特殊なことを行う場合は、チャネルを使用します。

    ご覧のとおり、さまざまなAPIはさまざまな目的で設計されています。一部のユースケースでは重複がありますが、他のユースケースでは1つのAPIのみが目的に適しています。


    あるスタイルのI / Oに対して別のスタイルの「優先」を開発する場合の問題は、ソフトウェアの不良につながることです。つまり、I / O効率が必要な場合は非効率的なコード、またはI / O効率が問題にならない場合は過度に複雑なコードのいずれかです。


    「大きなチャンクを読み書きするだけでI / Oを行う場合、BufferedXxxクラスは実際にスループットを少し低下させる可能性があります。」...この点はわかりません。そもそもBufferedXxxを使用することの要点は、1バイト/文字などではなくチャンクでIOを実行し、カーネルへのシステムコールの数を減らすことです。正確に何を意味しているか説明していただけますか?
    オタク2014

    アプリケーションが実行する実際のサイズreadまたはwrite呼び出しのサイズを参照しています。それらがすべてバイト配列からの(十分な)読み取りおよび書き込みである場合、BufferedXxxバッファーをバイパスし、基になるストリームの読み取り/書き込み呼び出しに直接マップします。その特定のケースでは、BufferedXxxラッパーはパフォーマンスに役立ちません。
    スティーブンC

    あなたが言っていたことが分かります。フォローアップありがとうございます。+1。
    オタク2014

    3

    答えは「状況によります」-バッファリング、ストリーミング、ブロッキング、およびノンブロッキングI / Oはすべて、同時実行性、スループット、その他のパフォーマンス特性に応じて、さまざまな目的で使用されます。

    弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
    Licensed under cc by-sa 3.0 with attribution required.