2017-02-08 9 views
3

私はSocketChannel,FileChannel等のクラスを見ているので、概念的な違いを明確にするための区別を知りたいです。 SocketとファイルI/Oストリームとの比較IOストリーム上のチャンネルラッパーですか?

私が知っているように、I/Oストリームは連続的にアクセスされなければならない。すなわち、それらは読み書きが可能な一連のバイトである。また、Buffered Streamを使用してI/Oの効率を高めることもできます。

したがって、Streamsと比較すると、全く新しいコンセプトの「チャンネル」、またはStreamsの単なるラッパーですか?

はい、「ストリームは一連のバイトです」と言えば、その意味で両方が異なる場合はどのようなチャネルですか?

+1

全く新しい。したがって、「nio」(または「新しいio」)。 IOストリーム*はある時点でチャンネルに実装されている可能性があります。 –

+0

いいえ。できません。ストリームはノンブロッキングモードではありません。それらは非同期に閉じることはできません。ストリーム書き込みはカウントを返しません。ストリームにはNIOのすべての機能を実装するのに十分な機能がありません。 – EJP

答えて

2

どちらもありません。チャンネルはストリームのラッパーではありません(ストリームをChannels.newChannel(InputStream)またはChannels.newChannel(OutputStream)で明示的にラップする場合を除く)、これらは「まったく新しい概念」ではありません。

チャネルは、特定のタイプに応じて、引き続き連続して読み書きできるバイトシーケンスを表します。 Channelsクラスのファクトリメソッドを使用してこれらのAPI間を変換できることは、関係があることを示しています。

しかし、NIO APIは、互換性のある方法で古いストリームクラスをリファクタリングすることで修正できなかった特定の設計上の問題に対処しています。例えば。ベースタイプは今やインターフェイスなので、特定のチャンネルでReadableByteChannelWritableByteChannelのように複数のタイプを同時に実装することができます。さらに、単一バイトを読み取る方法はありません。これは、「効率を高めるためにBufferedStreamを使用できます」という神話を取り除く良い方法です。不十分なバッファサイズがI/Oパフォーマンスのボトルネックの原因である場合は、ストリームまたはチャネルを別のバッファにラップし、バッファ間ですべてのデータを強制的にコピーするのではなく、より大きなバッファを最初に配置することで解決します。したがって、BufferedChannelはありません。

FileChannelのような特定の実装では、順次アクセスに加えて、基礎となるリソースへのランダムアクセスを可能にする追加のメソッドが用意されています。そうすれば、RandomAccessFile/InputStream/OutputStreamの関係のように、全く異なるAPIを扱う代わりに、統一されたインターフェースを使用することができます。

さらに、NIOを導入したときに以前に欠けていた多くのI/O機能が追加されました。それらのうちのいくつかは古いクラスの上に問題なく実装できたかもしれませんが、デザイナーは新しいAPIを使用することを明らかに支持しました。これらの機能は最初から設計上考慮することができます。

しかし、一般的に言えば、チャネルはストリームに比べてまったく新しい概念ではありません。

関連する問題