2013-07-05 46 views
14

Tôi đã đọc trên InputStream, FileInputStream, ByteArrayInputStream và cách sử dụng của họ có vẻ khá rõ ràng (suối đầu ra quá).Java: những thuận lợi và sử dụng FilterInputStream là gì so với các dòng khác

Những gì tôi đang gặp khó khăn là phải hiểu việc sử dụng FilterInputStream & FilterOutputStream:

  • lợi thế của việc sử dụng nó so với các lớp dòng khác là gì?
  • Khi nào tôi nên sử dụng?
  • Vui lòng cung cấp giải thích lý thuyết và ví dụ cơ bản.

Trả lời

18

FilterInputStream là một ví dụ về the Decorator pattern.

Lớp này phải được mở rộng, vì constructor của nó là protected. Lớp dẫn xuất sẽ bổ sung thêm các khả năng, nhưng vẫn phơi bày giao diện cơ bản của một InputStream.

Ví dụ: BufferedInputStream cung cấp bộ đệm của luồng đầu vào cơ bản để làm cho dữ liệu đọc nhanh hơn và DigestInputStream tính băm dữ liệu mật mã khi dữ liệu được tiêu thụ.

Bạn sẽ sử dụng tính năng này để thêm chức năng vào mã hiện tại phụ thuộc vào API InputStream hoặc OutputStream. Ví dụ: giả sử bạn sử dụng một số thư viện lưu dữ liệu vào OutputStream. Dữ liệu đang phát triển quá lớn, vì vậy bạn muốn thêm nén. Thay vì sửa đổi thư viện kiên trì dữ liệu, bạn có thể sửa đổi ứng dụng của mình để nó "trang trí" luồng mà hiện tại nó tạo bằng một ZipOutputStream. Thư viện sẽ sử dụng luồng giống như nó đã sử dụng phiên bản cũ thiếu nén.

+0

OK, nhưng BufferedInputStream và DigestInputStream thực sự làm điều gì đó với luồng cơ bản. FilterInputStream làm gì? – ed22

3

Bạn sử dụng chúng khi bạn muốn trang trí luồng dữ liệu. Hãy nhớ rằng các cá thể lớp dòng này tự quấn quanh một cá thể dòng khác (cho dù một lớp con khác) và thêm một số tính năng, thêm một số xử lý, thực hiện một số thay đổi đối với dữ liệu khi nó đi qua.

Ví dụ: bạn có thể muốn xóa tất cả không gian khỏi một số luồng. Bạn tạo lớp con của riêng bạn của FilterInputStream và ghi đè phương thức read(). Tôi sẽ không làm phiền mọi chi tiết nhưng đây là một số sorta-java cho phương pháp trong lớp con:

private boolean lastWasBlank = false; 
public int read() { 
    int chr = super.read(); 
    if (chr == ' ') { 
     if (lastWasBlank) { 
      return read(); 
     } else { 
      lastWasBlank = true; 
     } 
    } else { 
     lastWasBlank = false; 
    } 
    return chr; 
} 

Trong cuộc sống thực, bạn sẽ có thể gây rối với hai read() phương pháp khác nữa.

Các ứng dụng khác:

  • Log tất cả mọi thứ chảy qua các dòng
  • Nhân đôi 'tee' tiện ích để dòng được đọc được xử lý theo hai cách.
  • Chuyển đổi kết thúc dòng giữa Windows, Mac và các định dạng Unix/Linux
  • Thêm chậm trễ để mô phỏng các phương thức truyền chậm như modem hoặc cổng nối tiếp hoặc kết nối mạng không dây.
+0

FilterInputStream không làm bất cứ điều gì để giúp triển khai luồng lọc dữ liệu và hỗ trợ chính xác 'mark',' available', v.v. Bạn có biết lớp cơ sở thực sự giúp triển khai trình trang trí đầu vào không? –