"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."
" 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:"
// 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."
GO TO FULL VERSION