Điều gì được ưu tiên cho tệp I / O trong Java? [đóng cửa]


8

Trong ba

  • BufferedReader / Nhà văn
  • Luồng nhị phân
  • Kênh truyền hình

  • 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

    Câu trả lời:


    18

    java.io sử dụng Streamstrong khi java.nio sử dụng Channelsbuffer, 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:

    • Các tập tin có thể lớn nhưng không lớn. Có thể đọc toàn bộ tập tin vào bộ nhớ.
    • Một ứng dụng chỉ đọc hoặc ghi vào một vài tệp hoặc kết nối mạng cùng một lúc, lý tưởng là chỉ sử dụng một luồng tại một thời điểm.
    • Ứng dụng này là tuần tự. Nó sẽ không thể làm được gì nhiều cho đến khi đọc xong hoặc viết một tập tin.

    Trong những tình huống này, tốt hơn là sử dụng java.nio cách:

    • Một ứng dụng cần phục vụ hàng trăm hoặc hàng ngàn kết nối cùng một lúc.

    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

    https://www.ibm.com/developerworks/java/tutorials/j-nio/

    http://java.dzone.com/articles/java-nio-vs-io


    Tôi tìm thấy các kênh dễ dàng hơn các luồng java.io.
    Dummy Derp

    7
    Tốt cho bạn, bởi vì hầu hết mọi người (như tôi) nói rằng mô hình lập trình nio phức tạp như java io truyền thống.
    Saeed Zarinfam

    4

    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.


    "Nếu bạn chỉ thực hiện I / O bằng cách đọc / viết các đoạn lớn, thì các lớp BufferedXxx thực sự có thể giảm thông lượng một chút." ... Tôi không hiểu được điểm này. Không phải toàn bộ vấn đề sử dụng BufferedXxx ở vị trí đầu tiên là để bạn thực hiện IO theo từng khối chứ không phải byte / charater đơn, v.v. và điều đó làm giảm số lượng cuộc gọi hệ thống đến kernel? Bạn có thể vui lòng giải thích chính xác những gì bạn có ý nghĩa?
    Geek

    Tôi đang đề cập đến kích thước của thực tế readhoặc writecá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.
    Stephen C

    Tôi thấy điểm bạn đang làm. Cảm ơn đã theo lên. +1.
    Geek

    3

    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.

    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.