Java:NIOとNIO.2の違いは正確には何ですか?


83

どれだけ違うのかよくわからないので、この2つのパッケージについてお問い合わせがあります。

Googleを少し調べたところ、OracleはJDK7リリースの一部としてパッケージをNIO新しく拡張されたパッケージで更新することを決定したようNIO.2です。

  1. NIOパッケージのパフォーマンスはパッケージとどのように比較されNIO.2ますか?
  2. からNIOへの大きな変更は何NIO.2ですか?(例:新しい方法、機能)
  3. 元のNIOパッケージを更新する必要があったのはなぜですか?
  4. であるNIO.2とちょうど代名詞NIO、今日のパッケージ?

コードでレガシーパッケージを使用したいというわけではありません。これについて本当に興味があります。それらの違いを教えてください。


2
NIO2は、非同期I / Oとjava.nio.filesパッケージを導入しています。
ローン侯爵2014

それですか?NIO.2は何か巨大なものだと感じました。
John Huynh

1
最初に彼らはIOを持っていました。それから彼らは「新しいIO」を導入しました。それから彼らはもっと多くの機能を導入したかったので、彼らはそれを巧妙に「新しいIO2」と名付けました。
カヤマン2014

1
おかげで、私は考えました。つまり、「新しいIO 2」は、他の2つよりもあらゆる点で優れているということですか?「TheJavaTutorial」の本を読んでいて、NIO.2について教えていますが、IOに関するセクションもあります。
John Huynh 2014

1
@JohnHuynhいいえ、それは新しい機能を導入することを意味します。それらが必要ない場合は、使用しないでください。
ローン侯爵2015年

回答:


85

Javaは当初、ファイルシステムにアクセスFileするためのjava.ioパッケージでクラスを提供することから始まりました。このオブジェクトはファイル/ディレクトリを表し、ファイル/ディレクトリが存在するかどうかの確認、プロパティの取得、削除などの操作を実行できました。ただし、いくつかの欠点がありました。いくつか例を挙げると:

  • Fileクラスには、copyメソッドなどの重要な機能がいくつかありませんでした。
  • また、を返す多くのメソッドを定義しましたboolean。想像できるように、エラーの場合はfalse、例外をスローするのではなく、返されました。実際、開発者には、なぜ失敗したのかを知る方法がありませんでした。
  • シンボリックリンクのサポートに関する適切な処理を提供しませんでした。
  • 限られたファイル属性のセットが提供されました。

これらの問題を克服するために、java.nioパッケージがjava4に導入されました。主な機能は次のとおりです。

  • チャネルとセレクター:チャネルは、メモリマップファイルなどの低レベルのファイルシステム機能を抽象化したものです。
  • バッファ:すべてのプリミティブクラスのバッファリング(ブール値を除く)。
  • 文字セット:バイトとUnicode記号をマップするための文字セット(java.nio.charset)、エンコーダー、およびデコーダー

java 7では、java.nio.fileパッケージが導入され、シンボリックリンク、ファイル属性アクセスの処理をより適切にサポートし、特にPath、Paths、Filesなどのクラスを介してファイルシステムの拡張をサポートします。詳細については、java.nio.fileパッケージの説明を参照してください。

これを考慮して:

NIOからNIO.2への大きな変更点は何ですか?(例:新しい方法、機能)?

それらは異なる目的を果たします。大きな変更点を指摘するには、まったく新しいパッケージを確認することをお勧めしますjava.nio.file

元のNIOパッケージを更新する必要があったのはなぜですか?

そうではありませんでした。更新されるのではなく、新しいパッケージが導入されました。

NIO.2は最近のNIOパッケージと同義ですか?NIOパッケージのパフォーマンスはNIO.2パッケージとどのように比較されますか?

いいえ、それらは同義ではありません。また、目的が異なるため、パフォーマンスを比較してもあまり意味がありません。NIOは、ファイル管理に重点を置いた、より抽象的な低レベルのデータI / OおよびNIO2です。

お役に立てれば。

[参考文献:Oracle Certified Professional Java SE7-S​​GGanesh and TusharSharmaによる包括的なOCJP7認定ガイド-第9章]


57

NIO.2は非同期I / Oを導入しました

非同期I / Oは、NIOでサポートされていないノンブロッキングI / Oへのアプローチです。

NIO:セレクター/リアクターパターン

NIO.2:完了ハンドラー/プロクターパターン

したがって、Windowsの場合、NIO.2はI / O完了ポートを使用します。これにより、パフォーマンスが向上します。ただし、サーバー側でWindowsを使用している人はいないため、誰も知りません。使用している場合は、.netに多額の投資を行っているため、おそらく使用します。そのため、Javaの使用を検討しない可能性があります。


3
絶対とは絶対言うな。特に予測される作業負荷がそれほど高くない場合は、多くのWindowsベースのサーバーが使用されています。
Jonathan Rosenne 2017

リアクターvsプロクターは私が最も気づいたものです
LefterisEleftheriades18年

大手金融機関である私の会社にはたくさんのWindowsサーバーがあり、私たちは主にJavaを使用しています。
JanacMeena19年

9

私の見解:

短縮版

これは、高レベルの大幅に強化されたファイルおよびファイルシステム機能を備えたjava.nio.fileパッケージの追加です。
ネットワークソケットまたは低レベルのファイルアクセスの観点から、NIO == NIO.2で、いくつかの利便性が向上しています。

長いバージョン

Java IO

パッケージ:java.io
古いブロッキングI / O API

Java NIO

新しいノンブロッキングAPIであるJava1.4で追加されました。
パッケージ:java.nio
Java非ブロッキングIO。以下のようなクラスSelectorSelectorKeyChannel
(NIOは、ネットワークI / Oのためのアップ大きなステップだった私には思えるSelectorSelectorKeySocketChannelServerSocketChannelBufferはるかに少ないファイルI / Oのために(、)FileChannelBufferのみ、メモリマップされたファイルを含みます)。これは、ネットワーク部分とファイル部分の両方にとって、かなり低レベルのAPIです。

Java NIO.2

Java 7で追加されました。これは主に、大幅に改善されたファイルおよびファイルシステムの操作とアドレス指定APIの追加に関するものです。新しいファイルおよびファイルシステム関連のAPIは比較的高レベルです。

パッケージ:java.nio.fileそして親へのいくつかの追加java.nio
この追加はファイルI / O用であり、ネットワークI / Oまたは低レベルファイルAPIへのマイナーな追加はごくわずかです。

最も注目に値する低レベルで、ファイルに関連する必要のないAPIの追加は、、AsynchronousSocketChannelAsynchronousServerSocketChannelありAsynchronousFileChannel、一部のメソッドにコールバックバリアントを追加します。の非同期バージョンは、主に便利な追加機能です。このようなマッピングインターフェイスは、以前から一緒にハッキングされていた可能性がありましたが、現在はJREですぐに使用できます。

新しいファイルAPIには、Pathを使用したはるかに便利なファイルシステムアドレス指定、カスタムファイルシステムプロバイダーを使用した大幅に改善されたZIPファイル操作、特別なファイル属性アクセス、1つのコマンドでファイル全体を読み取る、ファイルをコピーするなどの便利な方法が多数含まれています。 1つのコマンドなど。しかし、それはすべてファイル/ファイルシステムに関連しており、すべて非常に高レベルです。

ネットワークソケットまたは低レベルのファイルアクセスの観点から、上記ですでに述べたことを繰り返しますが、NIO == NIO.2

関連リンク

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