Java: Sự khác biệt chính xác giữa NIO và NIO.2 là gì?


83

Tôi không hiểu rõ chúng khác nhau như thế nào nên tôi có một số thắc mắc liên quan đến hai gói này.

Sau khi xem xét một chút trên Google, có vẻ như Oracle đã quyết định cập nhật NIOgói với NIO.2gói nâng cao và mới hơn như một phần của bản phát hành JDK7.

  1. Làm thế nào để hiệu suất của NIOgói so với NIO.2gói?
  2. Một số thay đổi lớn từ NIOsang là NIO.2gì? (ví dụ: các phương pháp, tính năng mới)
  3. Tại sao NIOgói ban đầu phải được cập nhật?
  4. NIO.2chỉ đồng nghĩa với NIOgói hiện nay?

Không phải là tôi muốn sử dụng gói kế thừa trong mã của mình, tôi chỉ thực sự tò mò về điều này. Hãy cho tôi biết sự khác biệt của chúng?


2
NIO2 giới thiệu I / O không đồng bộ và gói java.nio.files.
Marquis of Lorne

Là nó? Tôi có ấn tượng rằng NIO.2 là một cái gì đó rất lớn.
John Huỳnh

1
Đầu tiên họ có IO. Sau đó, họ giới thiệu "IO mới". Sau đó, họ muốn giới thiệu nhiều chức năng hơn, vì vậy họ đã đặt tên nó một cách khéo léo là "New IO 2".
Kayaman

1
Cảm ơn, tôi đã hiểu. Vậy điều đó có nghĩa là "New IO 2" vượt trội hơn về mọi mặt so với hai phần còn lại? Tôi đang đọc cuốn sách "Hướng dẫn Java" và nó dạy về NIO.2, nhưng nó cũng có một phần về IO.
John Huỳnh

1
@JohnHuynh Không, nó có nghĩa là nó giới thiệu các tính năng mới. Nếu bạn không cần chúng, đừng sử dụng chúng.
Marquis of Lorne

Câu trả lời:


85

Ban đầu Java bắt đầu bằng cách cung cấp Filelớp, trong java.iogói để truy cập hệ thống tệp. Đối tượng này đại diện cho một tệp / thư mục và đã cho phép bạn thực hiện một số thao tác như kiểm tra xem tệp / thư mục có tồn tại hay không, lấy thuộc tính và xóa nó. Tuy nhiên, nó có một số thiếu sót. Đến tên một vài:

  • Lớp Tệp thiếu một số chức năng quan trọng, chẳng hạn như phương thức sao chép.
  • Nó cũng định nghĩa nhiều phương thức trả về boolean. Như người ta có thể tưởng tượng, trong trường hợp có lỗi, falseđược trả lại, thay vì ném một ngoại lệ. Thực tế, nhà phát triển không có cách nào biết được tại sao nó không thành công.
  • Không cung cấp xử lý tốt về hỗ trợ các liên kết tượng trưng.
  • Một tập hợp các thuộc tính tệp hạn chế đã được cung cấp.

Để khắc phục những vấn đề này, gói java.nio đã được giới thiệu trong java 4. Các tính năng chính là:

  • Kênh và Bộ chọn: Kênh là phần tóm tắt về các tính năng của hệ thống tệp cấp thấp hơn, ví dụ: tệp được ánh xạ bộ nhớ.
  • Bộ đệm: Bộ đệm cho tất cả các lớp nguyên thủy (ngoại trừ Boolean).
  • Charset: Charset (java.nio.charset), bộ mã hóa và bộ giải mã để ánh xạ byte và ký hiệu Unicode

Với java 7, gói java.nio.file được giới thiệu cung cấp hỗ trợ tốt hơn cho việc xử lý các liên kết tượng trưng, ​​truy cập thuộc tính tệp và đặc biệt để hỗ trợ mở rộng hệ thống tệp thông qua các lớp như Đường dẫn, Đường dẫn và Tệp. Bạn có thể muốn xem mô tả gói java.nio.file để biết thêm chi tiết về điều này.

Với điều này trong tâm trí:

Một số thay đổi lớn từ NIO sang NIO.2 là gì? (ví dụ: phương pháp, tính năng mới)?

Chúng phục vụ các mục đích khác nhau. Để chỉ ra những thay đổi lớn, bạn có thể muốn xem gói hoàn toàn mới java.nio.file.

Tại sao gói NIO gốc phải được cập nhật?

Nó đã không. Một gói mới đã được giới thiệu thay vì cập nhật.

Ngày nay NIO.2 có đồng nghĩa với gói NIO không? Hiệu suất của gói NIO so với gói NIO.2 như thế nào?

Không, chúng không đồng nghĩa. Việc so sánh hiệu suất giữa chúng cũng không có nhiều ý nghĩa vì chúng phục vụ các mục đích khác nhau. NIO một I / O dữ liệu cấp thấp trừu tượng hơn và NIO2 tập trung vào quản lý tệp.

Hi vọng điêu nay co ich.

[Thư mục: Oracle Certified Professional Java SE7 - Hướng dẫn chứng nhận OCJP7 toàn diện, của SGGanesh và Tushar Sharma - Chương 9]


57

NIO.2 giới thiệu i / o không đồng bộ .

I / O không đồng bộ là một cách tiếp cận đối với i / o không chặn không được NIO hỗ trợ.

NIO: bộ chọn / mẫu lò phản ứng

NIO.2: trình xử lý hoàn thành / mẫu cấu trúc viên

Do đó, khi trên Windows, NIO.2 sử dụng Cổng hoàn thành I / O , giúp tăng hiệu suất. Ngoại trừ, không ai biết, bởi vì không ai sử dụng Windows ở phía máy chủ, và nếu có, họ có thể làm như vậy vì họ đã đầu tư rất nhiều vào .net và vì lý do đó rất có thể sẽ không xem xét sử dụng Java.


3
Không bao giờ nói không bao giờ. Có rất nhiều máy chủ dựa trên Windows đang được sử dụng, đặc biệt khi tải công việc dự kiến ​​không quá cao.
Jonathan Rosenne

lò phản ứng vs proactor là những gì tôi nhận thấy hầu hết
Lefteris Eleftheriades

Rất nhiều máy chủ Windows tại công ty của tôi, một tổ chức tài chính hàng đầu và chúng tôi chủ yếu sử dụng Java.
Janac Meena

9

Lấy của tôi:

Phiên bản ngắn

Đó là việc bổ sung gói java.nio.file với chức năng hệ thống tệp và tệp nâng cao nhiều cấp độ của nó.
Từ góc độ ổ cắm mạng hoặc quyền truy cập tệp cấp thấp, NIO == NIO.2 với một vài cải tiến tiện lợi.

Phiên bản dài hơn

Java IO

Gói: java.io
API I / O chặn cũ

Java NIO

Đã thêm vào Java 1.4, API không chặn mới.
Gói: java.nio
IO không chặn Java. Lớp học thích Selector, SelectorKey, Channel.
Dường như với tôi những nio là một bước tiến lớn cho mạng I / O ( Selector, SelectorKey, SocketChannel, ServerSocketChannel, Buffer), ít hơn nhiều cho tập tin I / O ( FileChannelBufferduy nhất, bao gồm cả bộ nhớ file ánh xạ). Đây là một API cấp thấp, dành cho cả phần mạng và phần tệp.

Java NIO.2

Được thêm vào trong Java 7. Nó chủ yếu là bổ sung API xử lý và địa chỉ tệp và hệ thống tệp được cải thiện nhiều. Tệp mới và API liên quan đến hệ thống tệp là cấp tương đối cao.

Gói: java.nio.filevà một số bổ sung cho phụ huynh java.nio.
Những bổ sung này dành cho I / O tệp và chỉ một số bổ sung nhỏ cho I / O mạng hoặc API tệp cấp thấp.

Các bổ sung API cấp thấp, không cần thiết, đáng chú ý nhất là AsynchronousSocketChannel, AsynchronousServerSocketChannelAsynchronousFileChannelbổ sung thêm các biến thể gọi lại cho một số phương thức. Các phiên bản Không đồng bộ của chủ yếu là một bổ sung tiện lợi; các giao diện ánh xạ như vậy có thể đã bị tấn công cùng nhau ngay cả trước đây, nhưng bây giờ chúng đã có sẵn trong JRE.

API tệp mới mang lại nhiều tiện ích - xử lý hệ thống tệp hữu ích hơn nhiều với Path, thao tác tệp ZIP được cải thiện nhiều bằng cách sử dụng nhà cung cấp hệ thống tệp tùy chỉnh, truy cập thuộc tính tệp đặc biệt, nhiều phương pháp tiện lợi như đọc toàn bộ tệp bằng một lệnh, sao chép tệp bằng một lệnh, v.v. Nhưng tất cả đều liên quan đến tệp / hệ thống tệp và tất cả đều ở mức khá cao.

Nhắc lại những gì tôi đã nói ở trên, từ góc độ ổ cắm mạng hoặc quyền truy cập tệp cấp thấp, NIO == NIO.2

Các liên kết có liên quan

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.