Lucrul cu arhive ZIP
Pe lângă funcționalitatea generală pentru lucrul cu fișiere, Java oferă funcționalități pentru lucrul cu fișiere de tip zip-arhive. Pentru aceasta, în pachetul java.util.zip sunt definite două clase: ZipInputStream și ZipOutputStream.
ZipOutputStream - Scrierea arhivelor
Pentru a crea o arhivă, se utilizează clasa ZipOutputStream. Pentru a crea un obiect ZipOutputStream, în constructorul său se transmite un flux de ieșire:
ZipOutputStream(OutputStream out)
Pentru a scrie fișiere în arhivă, pentru fiecare fișier se creează un obiect ZipEntry, în constructorul căruia se transmite numele fișierului arhivat. Iar pentru a adăuga fiecare obiect ZipEntry în arhivă, se folosește metoda putNextEntry().
Iată un exemplu de creare a unei arhive:
import java.io.*;
import java.util.zip.*;
public class Program {
public static void main(String[] args) {
String filename = "notes.txt";
try(ZipOutputStream zout = new ZipOutputStream(new FileOutputStream("output.zip"));
FileInputStream fis = new FileInputStream(filename);)
{
ZipEntry entry1 = new ZipEntry("notes.txt");
zout.putNextEntry(entry1);
// citim conținutul fișierului într-un array de bytes
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
// adăugăm conținutul în arhivă
zout.write(buffer);
// închidem înregistrarea curentă pentru o nouă înregistrare
zout.closeEntry();
}
catch(Exception ex){
System.out.println(ex.getMessage());
}
}
}
După adăugarea obiectului ZipEntry în flux, trebuie să adăugăm și conținutul fișierului. Pentru aceasta, se folosește metoda write, care scrie în flux un array de bytes: zout.write(buffer);. La final, trebuie să închidem ZipEntry folosind metoda closeEntry(). După aceasta, putem adăuga noi fișiere în arhivă, repetând aceleași acțiuni pentru fiecare fișier nou.
Citirea arhivelor - ZipInputStream
Pentru citirea arhivelor se folosește clasa ZipInputStream. În constructor, aceasta primește un flux care indică către arhiva zip:
ZipInputStream(InputStream in)
Pentru a citi fișierele din arhivă, ZipInputStream folosește metoda getNextEntry(), care returnează un obiect ZipEntry. Obiectul ZipEntry reprezintă o înregistrare separată într-o arhivă zip. De exemplu, să citim o arhivă:
import java.io.*;
import java.util.zip.*;
public class Program {
public static void main(String[] args) {
try(ZipInputStream zin = new ZipInputStream(new FileInputStream("output.zip")))
{
ZipEntry entry;
String name;
while((entry = zin.getNextEntry()) != null){
name = entry.getName(); // obținem numele fișierului
System.out.printf("File name: %s \n", name);
// dezarhivare
FileOutputStream fout = new FileOutputStream("new" + name);
for (int c = zin.read(); c != -1; c = zin.read()) {
fout.write(c);
}
fout.flush();
zin.closeEntry();
fout.close();
}
}
catch(Exception ex){
System.out.println(ex.getMessage());
}
}
}
ZipInputStream primește în constructor o referință la un flux de intrare. Apoi, într-un ciclu, sunt afișate toate fișierele și dimensiunile lor în bytes, care se află în arhiva respectivă.
După aceea, datele sunt extrase din arhivă și salvate în fișiere noi, care se află în același director și care încep cu prefixul "new".