2012-03-05 44 views
5

Tôi hiện đang sử dụng một luồng đệm để đọc ghi một số tệp. Ở giữa tôi làm một số xử lý toán học, nơi một biểu tượng là một byte.Hiệu suất của DataInputStream DataOutputStream

Để đọc:

InputStream input = new FileInputStream(outputname) 
input.read(byte[] b,int off,int len) 

Để viết:

OutputStream output = new BufferedOutputStream(
          new FileOutputStream(outputname), 
          OUTPUTBUFFERSIZE 
         ) 
output.write((byte)byteinsideaint); 

Bây giờ tôi cần phải thêm một số dữ liệu tiêu đề, và để hỗ trợ hiệu ngắn quá. Tôi muốn sử dụng DataInputStreamDataOutputStream để tránh tự chuyển đổi các loại khác thành byte và tôi tự hỏi liệu hiệu suất của chúng có phải là gì không.

Tôi có cần phải sử dụng

OutputStream output = new DataOutputStream(
          new BufferedOutputStream(
            new FileOutputStream(outputname), 
            OUTPUTBUFFERSIZE 
          ) 
         ); 

để giữ lợi thế của đệm dữ liệu hoặc nó là đủ tốt để sử dụng

OutputStream output = new DataOutputStream(
          new FileOutputStream(outputname) 
         ) 

Trả lời

7

Bạn nên thêm BufferedOutputStream ở giữa. DataOutputStream không thực hiện bất kỳ bộ nhớ đệm nào (tốt: tách các mối quan tâm) và hiệu suất của nó sẽ rất kém mà không cần lưu vào bộ nhớ đệm OutputStream bên dưới. Ngay cả các phương pháp đơn giản nhất như writeInt() cũng có thể dẫn đến bốn lần ghi đĩa riêng biệt.

Theo như tôi chỉ có thể thấy write(byte[], int, int)writeUTF(String) đang ghi dữ liệu trong một đoạn byte[]. Những người khác viết các giá trị nguyên thủy (như int hoặc double) byte-by-byte.

+0

Điều này hoàn toàn giúp ích cho ngày của tôi. Cảm ơn bạn ^^ – Lake

1

Bạn hoàn toàn cần BufferedOutputStream ở giữa.

Tôi đánh giá cao sự quan tâm của bạn về hiệu suất, và tôi có 2 gợi ý:

  1. Shrink suối của bạn với khả năng nén java. Bài viết hữu ích có thể được tìm thấy here.
  2. Sử dụng bố cục thay vì thừa kế (được khuyến nghị thực hành). Tạo một đường ống có chứa PipedInputStream và PipedOutputStream kết nối với nhau, với phương thức getInputStream() và getOutputStream(). Bạn không thể trực tiếp truyền đối tượng Pipe cho một thứ gì đó cần luồng, nhưng bạn có thể truyền giá trị trả về của nó phương pháp để làm điều đó.
+0

Cảm ơn. Theo yêu cầu của nhiệm vụ của tôi tôi không phải nén khó khăn – UmNyobe

+0

GZip * Dòng có vấn đề lớn trong java, mặc dù, vì nó sử dụng rất nhiều bộ nhớ thông qua các cuộc gọi bản địa. LZ-4 có lẽ tốt hơn. – claj