Quando usare deflate () di deflateroutputstream?
Sto cercando di imparare a usare deflateroutputstream come qualcosa per ammazzare il tempo durante la mia pausa invernale. Sono confuso perché quando guardo la documentazione,https://docs.oracle.com/javase/7/docs/api/java/util/zip/DeflaterOutputStream.html, dice che deflate () è usato per scrivere dati compressi in outputstream, mentre write () è per scrivere dati in deflateroutputstream (outputstream compresso) da comprimere.
Tuttavia, sto guardando dei codici di esempio su Internet, ma nessuno usa affatto deflate (). Tutto il codice che ho visto finora si limita a scrivere () nel deflateroutputstream senza chiamare deflate ().https://stackoverflow.com/a/13060441/12181863
https://www.programcreek.com/java-api-examples/?api=java.util.zip.DeflaterOutputStream
Ho notato che il codice inserisce un fileoutputstream all'interno del deflateroutputstream, ma come interagisce? Chiama automaticamente deflate () per inviare dati compressi a fileoutputstream quando i dati vengono scritti in deflateroutputstream?
Risposte
È protected: è inteso per qualsiasi cosa che sottoclasse quel flusso, e non lo stai sottoclassando, quindi per quanto ti riguarda, è un dettaglio di implementazione che non puoi includere nel tuo ragionamento e che non devi invocare.
A meno che, ovviamente, non lo sottoclassi.
Cosa che potresti: è una sorta di toolkit per creare flussi di compressione basati su LZ. Ecco perché sia GZipOutputStream che ZipOutputStream lo estendono: si tratta di contenitori diversi che utilizzano più o meno la stessa tecnologia di compressione. E lo fanno invoke che deflate. A meno che tu non stia sviluppando il tuo sistema di compressione basato su LZ o implementando un lettore per un formato di compressione esistente, non zip, non gz, non deflater, questo non è pensato per te.
Questi tipi di flussi di output sono chiamati "flussi di filtri": essi stessi non rappresentano alcuna risorsa, ne avvolgono una. Possono avvolgere qualsiasi OutputStream(o qualsiasi InputStream, il concetto funziona su "entrambi i lati" per così dire) e modificare i byte in transito.
var out = new DeflaterOutputStream(whatever)crea un nuovo flusso deflater che comprimerà tutti i dati che gli invierai (tramite out.write(stuff)), ea sua volta prenderà i dati compressi e li invierà a qualunque cosa. Fa il lavoro di:
- prendere byte (come da
out.write), buffer quanto è necessario per fare il lavoro: - ... di comprimere questi dati.
- Quindi elabora i dati compressi, man mano che vengono compressi, inviandoli al flusso di output avvolto (
whatever, in questo esempio), chiamando il relativowritemetodo.
L'utilizzo di base è:
- Creare una risorsa, come
Files.newOutputStreamorsomeSocket.getOutputStreamorhttpServletResponse.getOutputStream()orSystem.outo qualsiasi altra cosa che produca un flusso: è un concetto astratto per una ragione: rendere le cose flessibili. - Avvolgi quella risorsa in un file
DeflaterOutputStream - Scrivi tutti i tuoi dati nel deflateroutputstream. Dimentica l'originale: l'hai fatto in modo da poterlo passare a DeflaterOutputStream, ed è lì che finisce la tua interazione con il flusso sottostante.
- Chiudi il deflaterstream (che finirà per chiudere anche il flusso sottostante).