devstory

Tutoriel sur la compression et la décompression Java

  1. Lire écrire le fichier zip en utilisant java.util.zip
  2. Lire écrire le fichier jar en utilisant java.util.jar
  3. Gérer le fichier RAR

1. Lire écrire le fichier zip en utilisant java.util.zip

Pour compresser et décompresser des fichiers, JDK vous fournit le package java.util.zip avec certaines classes pour ce faire.

Malheureusement, cette bibliothèque ne peut pas compresser et décompresser les formats courants tels que .rar ou 7zip. Pour gérer le format rar, 7zip, .. vous avez besoin d'une autre bibliothèque. Dans ce document, je dois parler à la bibliothèque pour ce faire.
C'est un image de fichier zip ouvert à l'aide de l'outil Winrar.
java.util.zip considère des fichiers dans le fichier comme des ZipEntry.
ListZipEntriesDemo.java
package org.o7planning.tutorial.javaiozip;

import java.io.FileInputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class ListZipEntriesDemo {

	public static void main(String[] args) {
		String FILE_PATH = "C:/test/datas.zip"; 
		ZipInputStream zipIs = null;
		try {
			// Créez l'objet ZipInputStream pour lire le fichier zip.
			zipIs = new ZipInputStream(new FileInputStream(FILE_PATH));

			ZipEntry entry = null;
			// Parcourir chaque Entry (de haut en bas jusqu'à la fin)
			while ((entry = zipIs.getNextEntry()) != null) {
				if (entry.isDirectory()) {
					System.out.print("Directory: ");
				} else {
					System.out.print("File: ");
				}
				System.out.println(entry.getName());
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				zipIs.close();
			} catch (Exception e) {
			}
		}
	} 
}
Les résultats de l'exécution de l'exemple :

Par exemple, décompressez le fichier zip dans un certain dossier :
UnZipDemo.java
package org.o7planning.tutorial.javaiozip;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class UnZipDemo { 
	public static void main(String[] args) {
		final String OUTPUT_FOLDER = "C:/output";
		String FILE_PATH = "C:/test/datas.zip";

		// Créez le dossier Output s'il n'existe pas.
		File folder = new File(OUTPUT_FOLDER);
		if (!folder.exists()) {
			folder.mkdirs();
		}
		// Créez un buffer (Tampon).
		byte[] buffer = new byte[1024];

		ZipInputStream zipIs = null;
		try {
			// Créez un objet ZipInputStream pour lire les fichiers à partir d'un chemin (path).
			zipIs = new ZipInputStream(new FileInputStream(FILE_PATH));

			ZipEntry entry = null;
			// Parcourir chaque Entry (de haut en bas jusqu'à la fin)
			while ((entry = zipIs.getNextEntry()) != null) {
				String entryName = entry.getName();
				String outFileName = OUTPUT_FOLDER + File.separator + entryName;
				System.out.println("Unzip: " + outFileName);

				if (entry.isDirectory()) {
					// Créer des dossiers.
					new File(outFileName).mkdirs();
				} else {
					// Créez un Stream pour graver des données dans le fichier.
					FileOutputStream fos = new FileOutputStream(outFileName);

					int len;
					// ​​​​​​​
					// Lisez les données sur Entry présent
					while ((len = zipIs.read(buffer)) > 0) {
						fos.write(buffer, 0, len);
					} 
					fos.close();
				} 
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				zipIs.close();
			} catch (Exception e) {
			}
		}
	} 
}
Les résultats de l'exécution de l'exemple :
Compresser un dossier
ZipDirectory.java
package org.o7planning.tutorial.javaiozip;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipDirectory { 
	public ZipDirectory() {

	} 
	// La méthode utilisée pour compresser un dossier.
	public void zipDirectory(File inputDir, File outputZipFile) {
		// Créez le dossier parent pour le fichier de sortie (output file).
		outputZipFile.getParentFile().mkdirs();

		String inputDirPath = inputDir.getAbsolutePath();
		byte[] buffer = new byte[1024];

		FileOutputStream fileOs = null;
		ZipOutputStream zipOs = null;
		try { 
			List<File> allFiles = this.listChildFiles(inputDir); 
			// Créez l'object ZipOutputStream pour graver le fichier zip.
			fileOs = new FileOutputStream(outputZipFile);
			// 
			zipOs = new ZipOutputStream(fileOs);
			for (File file : allFiles) {
				String filePath = file.getAbsolutePath(); 
				System.out.println("Zipping " + filePath);
				// entryName : est un chemin relatif.
				String entryName = filePath.substring(inputDirPath.length() + 1);

				ZipEntry ze = new ZipEntry(entryName);
				// AjouteZ entry au fichier zip.
				zipOs.putNextEntry(ze);
				// Lisez les données du fichier et écrivez sur le ZipOutputStream.
				FileInputStream fileIs = new FileInputStream(filePath); 
				int len;
				while ((len = fileIs.read(buffer)) > 0) {
					zipOs.write(buffer, 0, len);
				}
				fileIs.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			closeQuite(zipOs);
			closeQuite(fileOs);
		} 
	} 
	private void closeQuite(OutputStream out) {
		try {
			out.close();
		} catch (Exception e) {
		}
	} 
	// Cette méthode renvoie la liste des fichiers,
	// y compris tous les fichiers enfants, petits-enfants, .. du répertoire d'entrée.
	private List<File> listChildFiles(File dir) throws IOException {
		List<File> allFiles = new ArrayList<File>();

		File[] childFiles = dir.listFiles();
		for (File file : childFiles) {
			if (file.isFile()) {
				allFiles.add(file);
			} else {
				List<File> files = this.listChildFiles(file);
				allFiles.addAll(files);
			}
		}
		return allFiles;
	} 
	public static void main(String[] args) {
		ZipDirectory zipDir = new ZipDirectory(); 
		File inputDir = new File("C:/datas");
		File outputZipFile = new File("C:/output/datas.zip"); 
		zipDir.zipDirectory(inputDir, outputZipFile); 
	}
}
Les résultats de l'exécution d'exemple :

2. Lire écrire le fichier jar en utilisant java.util.jar

Fondamentalement lire, écrire le fichier jar n'est pas différent de lire, écrire un fichier Zip.
  • JarInputStream s'étend de ZipInputStream, soutient la fonctionnalité de la lecture des informations MANIFEST.
  • JarOutputStream s'étend de ZipOutputStream soutient la fonctionnalité de l'écriture des informations MANIFEST.
Les fichiers de la bibliothèque jar normale comprenant les informations de MANIFESTE sont souvent très simple.
Par exemple, voici un fichier MANIFESTE. MF emballé dans le fichier jar d’une applications de RAP contenant plus d’informations :
META-INF/MANIFEST.MF
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: RAPWorkbenchTutorial
Bundle-SymbolicName: RAPWorkbenchTutorial;singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: rapworkbenchtutorial.Activator
Require-Bundle: org.eclipse.rap.ui;bundle-version="2.3.0",
org.apache.felix.gogo.command;bundle-version="0.10.0",
org.apache.felix.gogo.runtime;bundle-version="0.10.0",
org.apache.felix.gogo.shell;bundle-version="0.10.0",
org.eclipse.equinox.console;bundle-version="1.1.0",
org.eclipse.equinox.http.jetty;bundle-version="3.0.200",
org.eclipse.equinox.ds;bundle-version="1.4.200",
org.eclipse.rap.rwt.osgi;bundle-version="2.3.0",
org.eclipse.rap.design.example;bundle-version="2.3.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-ActivationPolicy: lazy
Par exemple, un fichier jar est ouvert par Winrar :
Les entités dans le fichier jar sont considérées comme le JarEntry.
Un exemple de lire les informations du fichier MANIFEST. Voici l’image du contenu d’un fichier Manifest simple.
ReadJarFileDemo.java
package org.o7planning.tutorial.jar;

import java.io.FileInputStream;
import java.util.jar.Attributes;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
import java.util.jar.Manifest;

public class ReadJarFileDemo { 
	public static void main(String[] args) {
		String FILE_PATH = "C:/DevPrograms/Java/jdk1.7.0_45/lib/dt.jar"; 
		JarInputStream zipIs = null;
		try {
			// Créer un objet JarInputStream pour lire le fichier jar.
			zipIs = new JarInputStream(new FileInputStream(FILE_PATH)); 
			// Lire les informations de Manifest :
			Manifest manifest = zipIs.getManifest();
			Attributes atts = manifest.getMainAttributes();
			String version = atts.getValue("Manifest-Version");
			String createdBy = atts.getValue("Created-By");
			System.out.println("Manifest-Version:" + version);
			System.out.println("Created-By:" + createdBy);
			System.out.println("========================"); 
			JarEntry entry = null;
			// Parcourir chaque Entry (de haut en bas jusqu'à la fin)
			while ((entry = zipIs.getNextJarEntry()) != null) {
				if (entry.isDirectory()) {
					System.out.print("Folder: ");
				} else {
					System.out.print("File: ");
				}
				System.out.println(entry.getName());
			} 
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				zipIs.close();
			} catch (Exception e) {
			}
		}
	} 
}
Les résultats de l'exécution d'exemple:

3. Gérer le fichier RAR

Pour gérer un fichier RAR vous avez besoin d'une bibliothèque de source ouverte. Vous pouvez utiliser l'une des bibliothèques suivantes qui est arrangée dans l'ordre décroissant.
Dans ce document, je vais vous donner des instructions à utiliser de JUnRar (la version au moment de la 9-2014 est de 0,7)
Download junrar:

Java Basic

Show More