Lập trình Java, I/O cho đến gần đây được thực hiện bằng cách sử dụng phép ẩn dụ dòng. Tất cả I/O được xem như là chuyển động của các byte đơn, mỗi lần một, thông qua một đối tượng được gọi là Luồng. Dòng I/O được sử dụng để liên lạc với thế giới bên ngoài. Nó cũng được sử dụng trong nội bộ, để biến các đối tượng thành các byte và sau đó quay trở lại các đối tượng.
NIO có cùng vai trò và mục đích như I/O gốc, nhưng nó sử dụng ẩn dụ khác - khối I/O. java.nio (new/non-blocking I/O)) API được giới thiệu với JDK1.4.
Sự khác biệt giữa luồng I/O và chặn I/O là gì?
Hệ thống I/O định hướng luồng giao dịch với dữ liệu một byte tại một thời điểm. Một luồng đầu vào tạo ra một byte dữ liệu và luồng đầu ra tiêu thụ một byte dữ liệu. Rất dễ dàng để tạo bộ lọc cho dữ liệu được truyền trực tuyến. Nó cũng tương đối đơn giản để kết nối nhiều bộ lọc với nhau để mỗi một bộ phận của nó thực hiện một phần trong cơ chế xử lý đơn lẻ, tinh vi. Mặt khác, I/O định hướng luồng thường khá chậm.
Hệ thống I/O theo hướng khối có giao dịch với dữ liệu theo khối. Mỗi hoạt động tạo ra hoặc tiêu thụ một khối dữ liệu trong một bước. Xử lý dữ liệu theo khối có thể nhanh hơn nhiều so với xử lý nó bằng byte (được truyền). Nhưng I/O khối theo định hướng thiếu một số sự tao nhã và đơn giản của I/O định hướng luồng.
Khi nào bạn nên sử dụng java.io và khi nào bạn nên sử dụng java.nio?
Khả năng mở rộng có thể sẽ giúp bạn chọn gói. java.net sẽ yêu cầu một luồng cho mỗi socket. Mã hóa nó sẽ dễ dàng hơn đáng kể. java.nio hiệu quả hơn nhiều, nhưng rất khó để mã hóa xung quanh.
Bạn có thể nhận được khả năng mở rộng tốt hơn khi bạn đang xử lý hàng chục nghìn kết nối, nhưng với số thấp hơn, bạn có thể nhận được thông lượng tốt hơn bằng cách chặn IO.
Khi làm việc với SSL java.nio không phải là một điều dễ dàng để đối phó với
Quan trọng: Nếu bạn đang làm việc với một trong các gói, nó không phải là một ý tưởng tốt để tạo ra khuôn khổ từ đầu cho đến khi và trừ khi bạn có một lý do thuyết phục để làm vì thế.
Đối với java.nio, các dự án như Grizzly và Quick Server cung cấp các thành phần máy chủ không chặn có thể tái sử dụng được.
Worth đọc Pain points with java.nio
Cuối cùng nó nắm để yêu cầu cụ thể của dự án của bạn và những gì bạn đang cố gắng để đạt được. Một số giải pháp tốt nhất có thể không yêu cầu cơ sở hạ tầng phức tạp nhất tại al
Cập nhật: Gần đây đã tìm hiểu về gói NIO.2 tồn tại từ ngày 1.7. NIO.2 khác với NIO, chính là NIO.2 cung cấp chức năng kênh không đồng bộ. NIO.2 primer
Nếu bạn đang làm việc với NIO, đáng xem qua sự khác biệt và cái nào phù hợp với mục đích của bạn.
Không phải là * người trả lời *, vì vậy tôi sẽ đăng một nhận xét: [Trang Wikipedia trên đó] (http://en.wikipedia.org/wiki/New_I/O) thảo luận về một số mục tiêu và lý do cho gói nio. –
Là một phần của thư viện NIO2 được thêm vào trong Java 7. BTW: Mặc dù có rất nhiều sự tập trung vào các ổ cắm NIO không chặn, nhưng tôi thường sử dụng chặn NIO Sockets đơn giản hơn để sử dụng IMHO. NIO2 Thêm NIO không đồng bộ cho Ổ cắm và Tệp. –