2012-12-01 44 views
5

Các mã sau đây được chiết xuất từ ​​các Java Web Start chương của lõi khối lượng java 1.Sự khác nhau giữa InputStream và ByteArrayInputStream là gì?

 ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    PrintStream printOut = new PrintStream(out); 
    printOut.print(panel.getText()); 
    //panel.getText() return a String 
    InputStream data = new ByteArrayInputStream(out.toByteArray()); 
    FileSaveService service = (FileSaveService) ServiceManager 
      .lookup("javax.jnlp.FileSaveService"); 
    service.saveFileDialog(".", new String[] { "txt" }, data, "calc.txt"); 

Có bốn đối tượng được tạo, suối được chuyển hướng ba lần. Có phương pháp nào khác để ghi dữ liệu vào một tệp bằng cách sử dụng jnlp api không? sự khác nhau giữa InputStream và ByteArrayInputStream là gì?

+3

Máy tính rất nhanh. Không có gì là "khủng khiếp" trừ khi bạn cần phải làm điều đó một số lượng rất lớn của lần, hoặc rất quan trọng hiệu suất của nó. – JimN

+0

Bạn nên thay đổi tiêu đề: đó là dữ liệu không có ngày tháng. Sau đó, nó sẽ là khủng khiếp để viết một dấu thời gian ngày 8 byte vào một tập tin. – AlexWien

+0

Tôi có nghĩa là nó quá phức tạp đối với một lập trình viên, không phải là máy tính.Và tôi muốn biết là nó cần thiết để mã theo cách này. – scobur

Trả lời

4

ByteArrayInputStreamByteArrayOututStream đang triển khai trong bộ nhớ để sử dụng khi bạn muốn lưu trữ tạm thời dữ liệu trong bộ nhớ theo kiểu giống như dòng, sau đó bơm lại ở một nơi khác.

Ví dụ, chúng ta hãy giả sử bạn có một phương pháp mà hy vọng thêm một input stream như một tham số, ví dụ:

public Document parseXml(InputStream in) // build an XML document from data read in 

nhưng bạn muốn gửi nội dung nói về một String với nó. Sau đó, bạn sẽ sử dụng một ByteArrayInputStream và điền nó với nội dung của chuỗi của bạn và vượt qua ByteArrayInputStream cho phương pháp.


Ví dụ về cách sử dụng ByteArrayOutputStream có thể là nếu phương pháp ghi vào luồng đầu ra, nhưng bạn chỉ muốn nắm bắt kết quả và tải trực tiếp.

0

InputStream là Giao diện chung cho luồng đầu vào.
FileInputStream và ByteArrayInputStream đều triển khai giao diện đó.

0

InputStream là lớp trừu tượng và tất cả các lớp mở rộng từ nó đại diện cho luồng đầu vào của byte. Các ứng dụng cần xác định lớp con của InputStream phải luôn cung cấp phương thức trả về byte đầu vào tiếp theo. nơi mà một ByteArrayInputStream chứa một bộ đệm bên trong có chứa byte có thể được đọc từ dòng. Một bộ đếm nội bộ theo dõi byte tiếp theo được cung cấp bởi phương thức đọc.

Bởi vì khái niệm đa hình bạn có thể gán một đứa trẻ để phụ huynh giống như

InputStream data = new ByteArrayInputStream(out.toByteArray()); 

sau đó nếu chúng tôi sẽ gọi data.read() có nghĩa là chúng ta đang kêu gọi ByteArrayInputStream đọc phương pháp vì ByteArrayInputStream đang cung cấp thực hiện đọc() ở đâu trong phương thức InputStream read() là trừu tượng.

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