"Ciao, Amico!"

"Ciao, Eli!"

"Oggi studieremo i flussi di I/O."

"Sì, so già tutto su di loro. Usiamo le classi FileInputStream e FileOutputStream qui."

"Sì, e quali metodi di queste classi conosci?"

"Certo. Ecco i metodi di FileInputStream:"

Metodo Descrizione
int read() Legge un byte e lo restituisce.
int read(byte b[]) Legge un array di byte e lo restituisce.
int read(byte b[], int off, int len) Legge una matrice di byte dal flusso.
long skip(long n) Salta n byte, utilizzato durante la lettura dal flusso.
int available() Restituisce il numero di byte che possono ancora essere letti dal flusso.
void close() Chiude il flusso.

"Azzeccato! E i metodi di FileOutputStream?"

"Guarda:"

Metodo Descrizione
void write(int b) Scrive un byte nel flusso.
void write(byte b[]) Scrive una matrice di byte nel flusso.
void write(byte b[], int off, int len) Scrive una matrice di byte nel flusso.
void close() Chiude il flusso.

"Amigo, mi sorprendi!"

"E poi qualche!"

"Va bene, allora ti darò due nuove classi: ZipInputStream e ZipOutputStream."

FileInputStream, FileOutputStream, ZipOutputStream, ZipInputStream - 1

" Zip ? È come un file zip?"

"Esattamente. Questi flussi sono progettati per funzionare con i file zip. Puoi usarli per leggere o scrivere direttamente su un file zip!"

"Santo cielo! Che interessante. Ma un file zip non può contenere un solo file, ma diversi. Come funzionano?"

"Per questo, c'è un'altra classe speciale: ZipEntry . Presenta un file archiviato nell'archivio. Puoi solo leggere oggetti ZipEntry da ZipInputStream , e puoi solo scrivere oggetti ZipEntry su ZipOutputStream . Ma si scopre che puoi leggere e scrivere su una ZipEntry proprio come un normale file."

"Potresti farmi un esempio di come funziona?"

"Certo. Ecco un esempio in cui creiamo un archivio e inseriamo un file al suo interno:"

Codice
// Create an archive
FileOutputStream zipFile = new FileOutputStream("c:/archive.zip");
ZipOutputStream zip = new ZipOutputStream(zipFile);

//Put a ZipEntry into it
zip.putNextEntry(new ZipEntry("document.txt"));

//Copy the file «document-for-archive.txt» to the archive under the name «document.txt»
File file = new File("c:/document-for-archive.txt");
Files.copy(file.toPath(), zip);

// Close the archive
zip.close();

"Che interessante! E decomprimere i file è altrettanto facile?"

"Sì. Ecco una breve descrizione dei metodi delle classi ZipEntry , ZipInputStream   e ZipOutputStream "

" ZipInputStream è un flusso, quindi tutti gli ZipEntry possono essere letti solo in sequenza. Ecco i suoi metodi:"

Metodo Descrizione
ZipEntry getNextEntry() Restituisce un oggetto che descrive la ZipEntry successiva (salta tutti i byte nella voce corrente).
void closeEntry() Chiude il flusso di input sulla ZipEntry corrente (salta tutti i byte nella voce corrente).
int available() Restituisce 1 se sono disponibili ZipEntries, altrimenti 0.
int read(byte[] b, int off, int len) Legge i byte dall'attuale ZipEntry.
long skip(long n) Salta n byte durante la lettura dal flusso.
void close() Chiude il flusso.

"Non capisco davvero."

"La cosa migliore da fare è immaginare di leggere un file di testo e le ZipEntries sono come righe nel file. Puoi leggere i dati dalla riga corrente (la ZipEntry corrente) o saltare da una riga all'altra ( getNextEntry , closeEntry ) ."

"Penso di aver capito, ma non ne sono sicuro."

"Ecco ZipOutputStream e i suoi metodi:"

Metodo Descrizione
void setComment(String comment) Imposta un commento sull'archivio.
void setMethod(int method) Imposta il metodo di compressione (tipo).
void setLevel(int level) Imposta il livello di compressione. Maggiore è la compressione, più lento va.
void putNextEntry(ZipEntry e) Aggiunge un nuovo ZipEntry.
void closeEntry() Chiude la ZipEntry corrente
void write(byte[] b, int off, int len) Scrive un set di byte nell'oggetto ZipEntry corrente.
void close() Chiude il flusso.

"Ma nell'esempio sopra non abbiamo usato quasi niente di tutto questo."

"Questi sono metodi facoltativi. Non è necessario specificare il livello e il metodo di compressione: verranno utilizzate le impostazioni predefinite."

"Hmm. Non è poi così male. E ZipEntry?"

"Certo. Le uniche altre informazioni in una ZipEntry sono le informazioni sulla pulizia:"

Metodo Descrizione
String getName(), setName(String) File di nome interno.
long getTime(), setTime(long) L'ultima volta che la voce è stata modificata.
long getCRC(), setCRC(long) Somma di controllo.
long getSize(), setSize(long) Dimensione prima della compressione.
int getMethod(), setMethod(int) Metodo di compressione.
long get/setCompressedSize() Dimensioni dopo la chiusura lampo.
boolean isDirectory() La voce è una directory?

"Non sembra molto difficile. Cosa non c'è da amare!"

"Eccellente, allora Diego ti affiderà compiti anche su questo argomento."

"Avrei dovuto tenere la bocca chiusa."