2012-04-29 55 views
16

Tôi đã học gói java nio và tôi nhận ra có rất nhiều phương thức đã được cung cấp bởi File mà nio.Files đang cung cấp lại bằng cách sử dụng lớp Path. Như thế tôi nhận được ít hơn. Tôi thực sự không nhận được việc sử dụng thực tế của gói nio là gì.Việc sử dụng chính xác gói java nio khi các phương thức sẵn có với gói io

Tôi chỉ mới sử dụng gói này vì vậy có thể là câu hỏi của tôi là sai nhưng một chút trợ giúp có thể giúp tôi đọc thêm.

+2

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. –

+0

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. –

Trả lời

8

Sự khác biệt chính giữa IO và NIO là IO đang chặn, trong khi NIO không bị chặn.

This article giải thích sự khác biệt trong các gói và những gì chặn và không chặn IO.

+22

Vui lòng không đăng chỉ một liên kết. Khi liên kết đó chết, thì câu trả lời này cũng vậy. –

+2

NIO có thể chặn, không chặn hoặc không đồng bộ. Đây không phải là sự khác biệt chính chút nào. – EJP

+0

@Deco Yếu tố chặn cũng giữ tốt cho 'java.io.File' so với' java.nio.file'? – overexchange

1

Hầu hết mọi phương thức trong java.io.File đều có vấn đề không thể sửa được vì lý do tương thích, rõ ràng nhất là các phương thức trả về boolean khi chúng thất bại. Những vấn đề này cộng với mong muốn hỗ trợ các hệ thống tệp có thể cắm được và nhiều thứ khác đòi hỏi sự phát triển của một API hệ thống tệp hoàn toàn mới vì vậy đây là lý do tại sao java.nio.file được tạo ra.

7

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?

  1. 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.

  2. 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.

  3. 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.

+0

Tôi nghĩ đây là câu trả lời hay nhất – lolski

+0

Và câu trả lời này có vẻ là bản sao của một cuốn sách ... – CuriousMind

2

Java NIO: Kênh và bộ đệm
Trong API IO chuẩn, bạn làm việc với luồng byte và luồng ký tự. Trong NIO bạn làm việc với các kênh và bộ đệm. Dữ liệu luôn được đọc từ một kênh vào bộ đệm hoặc được ghi từ bộ đệm tới kênh.

Java NIO: Không chặn IO
Java NIO cho phép bạn không chặn IO. Ví dụ, một luồng có thể yêu cầu một kênh đọc dữ liệu vào một bộ đệm. Trong khi kênh đọc dữ liệu vào bộ đệm, thì chuỗi có thể làm điều gì đó khác. Khi dữ liệu được đọc vào bộ đệm, luồng có thể tiếp tục xử lý nó. Điều này cũng đúng cho việc ghi dữ liệu lên các kênh.

Java NIO: Bộ chọn
Java NIO chứa khái niệm "bộ chọn". Bộ chọn là một đối tượng có thể giám sát nhiều kênh cho các sự kiện (như: kết nối đã mở, dữ liệu đến vv). Do đó, một luồng đơn có thể giám sát nhiều kênh cho dữ liệu.
More detail on orcale

0

NIO cũng đã giới thiệu Kênh trừu tượng hóa chuyên môn trong Luồng - Tệp, Ổ cắm, Mạng.

Các vấn đề liên quan