Khi nào sử dụng deflate () của deflateroutputstream?
Tôi đang cố gắng học cách sử dụng deflateroutputstream như một thứ để giết thời gian trong kỳ nghỉ đông của tôi. Tôi bối rối vì khi tôi xem tài liệu,https://docs.oracle.com/javase/7/docs/api/java/util/zip/DeflaterOutputStream.html, nó nói rằng deflate () được sử dụng để ghi dữ liệu nén vào dòng xuất, trong khi write () là ghi dữ liệu vào dòng deflateroutputstream (dòng đầu ra được nén) sẽ được nén.
Tuy nhiên, tôi đang xem các mã mẫu trên internet, nhưng không ai sử dụng deflate () cả. Tất cả mã mà tôi đã thấy cho đến nay chỉ cần ghi () vào dòng deflateroutputstream mà không gọi deflate ().https://stackoverflow.com/a/13060441/12181863
https://www.programcreek.com/java-api-examples/?api=java.util.zip.DeflaterOutputStream
Tôi nhận thấy rằng mã này đặt một dòng fileoutputstream bên trong dòng deflateroutputstream, nhưng nó tương tác như thế nào? Nó có tự động gọi deflate () để gửi dữ liệu nén đến fileoutputstream khi dữ liệu được ghi vào deflateroutputstream không?
Trả lời
Nó protected: Nó dành cho bất cứ thứ gì phân lớp luồng đó và bạn không phân lớp nó, theo như bạn biết, nó là một chi tiết triển khai mà bạn không thể đưa vào lý luận của mình và không có nghĩa là bạn phải gọi ra.
Tất nhiên, trừ khi bạn phân loại nó.
Mà bạn có thể - đó là một bộ công cụ để xây dựng các luồng nén dựa trên LZ. Đó là lý do tại sao cả GZipOutputStream và ZipOutputStream đều mở rộng nó: Đó là những vùng chứa khác nhau ít nhiều sử dụng cùng một công nghệ nén. Và họ thực hiện điều đó deflate. Trừ khi bạn đang phát triển hệ thống nén dựa trên LZ của riêng mình hoặc triển khai trình đọc cho định dạng nén dựa trên không zip, không gz, không deflater hiện có, điều này không dành cho bạn.
Những loại dòng đầu ra này được gọi là 'dòng phim': Bản thân chúng không đại diện cho bất kỳ tài nguyên nào, chúng quấn quanh một nguồn. Họ có thể bao quanh bất kỳ OutputStream(hoặc bất kỳ InputStream, khái niệm hoạt động trên 'cả hai bên' có thể nói như vậy) và sửa đổi các byte khi chuyển tiếp.
var out = new DeflaterOutputStream(whatever)tạo một luồng deflater mới sẽ nén bất kỳ dữ liệu nào bạn gửi đến nó (thông qua out.write(stuff)) và đến lượt nó, nó sẽ lấy dữ liệu đã nén và gửi đến bất kỳ thứ gì. Nó thực hiện công việc của:
- lấy byte (theo từng
out.write), đệm nhiều khi cần thiết để thực hiện công việc: - ... của việc nén dữ liệu này.
- Sau đó, xử lý dữ liệu nén, khi nó được nén, bằng cách gửi nó đến dòng đầu ra được bao bọc (
whatevertrong ví dụ này), bằng cách gọiwritephương thức của nó .
Cách sử dụng cơ bản là:
- Tạo một tài nguyên, chẳng hạn như
Files.newOutputStreamhoặcsomeSocket.getOutputStreamhoặchttpServletResponse.getOutputStream()hoặcSystem.outhoặc bất kỳ thứ gì khác tạo ra một luồng - đó là một khái niệm trừu tượng vì một lý do: Để làm cho mọi thứ trở nên linh hoạt. - Gói tài nguyên đó vào một
DeflaterOutputStream - Ghi tất cả dữ liệu của bạn vào luồng deflateroutputstream. Quên về bản gốc - bạn đã tạo nó để có thể chuyển nó đến DeflaterOutputStream và đó là nơi kết thúc tương tác của bạn với luồng bên dưới.
- Đóng luồng giảm phát (điều này cũng sẽ đóng luồng bên dưới).