Trong ba
cái nào được ưa thích hơn trong đời thực cho tệp I / O trong Java và tại sao?
Tôi thích các kênh cho dữ liệu nhị phân được đưa vào tệp hoặc đọc từ và BufferedReader / Writer cho dữ liệu Chuỗi
Trong ba
Câu trả lời:
java.io sử dụng Streams
trong khi java.nio sử dụng Channels
và buffer
, Sự khác biệt quan trọng nhất giữa cách java.io và cách java.nio là cách dữ liệu được đóng gói và truyền.java.io xử lý dữ liệu theo luồng (mỗi byte một lần), trong khi java.nio xử lý dữ liệu theo khối. Xử lý dữ liệu theo khối có thể nhanh hơn nhiều so với xử lý theo byte (được truyền phát) nhưng nó không dễ như luồng.
Trong những tình huống này, tốt hơn là sử dụng cách java.io:
Trong những tình huống này, tốt hơn là sử dụng java.nio cách:
Bạn có thể xem các liên kết sau để biết thêm thông tin:
http://www.skill-guru.com/blog/2010/11/14/java-nio-vs-java-io-which-one-to-use/
http://bloss.oracle.com/slc/entry/javanio_vs_javaio
cái nào được ưa thích hơn trong đời thực cho tệp I / O trong Java và tại sao?
Nó thực sự nên là một vấn đề của chức năng hơn là ưu tiên.
Bạn sử dụng Trình đọc và Nhà văn cho dữ liệu hướng ký tự (yêu cầu mã hóa và giải mã), Input / OutputStreams cho dữ liệu hướng byte và luồng nhị phân nếu dữ liệu mã hóa dữ liệu nhị phân.
Bạn sử dụng các lớp BufferedXxx nếu bạn cần I / O ở mức độ chi tiết của một ký tự hoặc byte. Chúng là một cách đơn giản để tránh các vấn đề hiệu năng nghiêm trọng có thể xảy ra nếu bạn thực hiện nhiều lần đọc và viết các tòa nhà chọc trời.
Nếu bạn chỉ thực hiện I / O bằng cách đọc / ghi các đoạn lớn, thì các lớp BufferedXxx có thể thực sự có thể giảm thông lượng một chút. Bạn có thể sử dụng trình đọc / ghi / luồng đơn giản (với số lượng lớn char[]
hoặc byte[]
bộ đệm) hoặc Kênh và XxxBuffers. Cái sau có khả năng nhanh hơn, nhưng các API khó xử hơn.
Bạn sử dụng Kênh nếu bạn cần chi phí thấp và / hoặc thực hiện những việc chuyên biệt như "chọn" từ nhiều luồng, phân tán / thu thập và truy cập tệp ánh xạ bộ nhớ.
Như bạn có thể thấy, các API khác nhau được thiết kế cho các mục đích khác nhau. Trong một số trường hợp sử dụng có sự trùng lặp, trong các trường hợp khác chỉ có một API phù hợp với mục đích.
Vấn đề với việc phát triển "ưu tiên" cho một kiểu I / O so với kiểu khác là nó dẫn đến phần mềm xấu; tức là hoặc mã không hiệu quả khi cần hiệu quả I / O hoặc quá phức tạp khi hiệu quả I / O không phải là vấn đề đáng lo ngại.
read
hoặc write
các cuộc gọi mà một ứng dụng thực hiện. Nếu tất cả chúng đều lớn (đủ) đọc và ghi vào / từ một mảng byte, thì chúng sẽ bỏ qua bộ đệm BufferedXxx và ánh xạ thẳng để đọc / ghi các cuộc gọi trên luồng bên dưới. Trong trường hợp cụ thể đó, trình bao bọc BufferedXxx không giúp thực hiện.
Câu trả lời là "Nó phụ thuộc" - Tất cả các I / O được đệm, phát trực tuyến, chặn và không chặn đều được sử dụng cho các mục đích khác nhau tùy thuộc vào tính đồng thời, thông lượng và các đặc tính hiệu suất khác mà bạn theo đuổi.