MySQL Java JavaScript PHP Python HTML-CSS C-sharp

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".

← Lecția anterioară Lecția următoare →