Deflateroutputstream'in deflate () ne zaman kullanılır?
Kış tatilim sırasında deflateroutputstream'i zaman öldürmek için nasıl kullanacağımı öğrenmeye çalışıyorum. Kafam karıştı çünkü belgelere baktığımdahttps://docs.oracle.com/javase/7/docs/api/java/util/zip/DeflaterOutputStream.html, deflate () 'in çıktı akışına sıkıştırılmış bir veri yazmak için kullanıldığını, write () ise sıkıştırılacak deflater çıktı akışına (sıkıştırılmış çıktı akışı) veri yazmak için kullanıldığını söylüyor.
Bununla birlikte, internetteki örnek kodlara bakıyorum, ancak hiç kimse deflate () kullanmıyor. Şimdiye kadar gördüğüm tüm kodlar deflateroutputstream'e deflate () çağırmadan sadece () yazın.https://stackoverflow.com/a/13060441/12181863
https://www.programcreek.com/java-api-examples/?api=java.util.zip.DeflaterOutputStream

Kodun deflater çıktı akışının içine bir dosya çıktı akışı koyduğunu fark ettim, ancak bu nasıl etkileşim kuruyor? Veriler deflateroutputstream'e yazıldığında sıkıştırılmış veriyi fileoutputstream'e göndermek için otomatik olarak deflate () çağırır mı?
Yanıtlar
Bu protected
: Bu, bu akışı alt sınıflara ayıran herhangi bir şey için tasarlanmıştır ve siz onu alt sınıflara ayırmıyorsunuz, bu nedenle, düşündüğünüz kadarıyla, muhakemenize dahil edemeyeceğiniz ve çağırmanız gerekmeyen bir uygulama ayrıntısıdır.
Tabii alt sınıflamadıkça.
Hangisi olabilir - üstüne LZ tabanlı sıkıştırma akışları oluşturmak için bir tür araç takımı. Bu nedenle, hem GZipOutputStream hem de ZipOutputStream onu genişletiyor: Bunlar, aşağı yukarı aynı sıkıştırma teknolojisini kullanan farklı kaplardır. Ve bunu çağırıyorlar deflate
. Kendi LZ tabanlı sıkıştırma sisteminizi geliştirmiyorsanız veya mevcut, zip olmayan, gz olmayan, deflater olmayan bir sıkıştırma biçimi için bir okuyucu uygulamıyorsanız, bu sizin için uygun değildir.
Bu tür çıktı akışları 'filtre akışları' olarak adlandırılır: Kendileri herhangi bir kaynağı temsil etmezler, birini sararlar. Herhangi birini OutputStream
(veya herhangi bir InputStream
kavramı, tabiri caizse 'her iki tarafta da çalışır) sarmalayabilir ve geçiş sırasında baytları değiştirebilirler.
var out = new DeflaterOutputStream(whatever)
Gönderdiğiniz herhangi bir veriyi (aracılığıyla out.write(stuff)
) sıkıştıracak yeni bir deflater akışı oluşturur ve bu da sıkıştırılmış verileri alıp her neyse ona gönderir. Şu işi yapar:
- bayt al (başına
out.write
), işi yapmak için gerektiği kadar arabelleğe al: - ... bu verileri sıkıştırmak.
- Daha sonra sıkıştırılmış verileri, yöntemini
whatever
çağırarak sarmalanmış çıktı akışına göndererek ( bu örnekte) sıkıştırılmış verileri işleyinwrite
.
Temel kullanım şudur:
- Bir akış oluşturan
Files.newOutputStream
veyasomeSocket.getOutputStream
veyahttpServletResponse.getOutputStream()
veyaSystem.out
veya başka herhangi bir şey gibi bir kaynak oluşturun - bu, bir nedenle soyut bir kavramdır: İşleri esnek kılmak. - Bu kaynağı bir
DeflaterOutputStream
- Tüm verilerinizi deflater çıktı akışına yazın. Orijinali unutun - bunu DeflaterOutputStream'e geçirebilmek için yaptınız ve temeldeki akışla etkileşiminiz burada bitiyor.
- Deflater akışını kapatın (bu, temeldeki akışı da kapatacaktır).