codestory

Komprimierung und Dekomprimierung in Java

  1. Lesen und schreiben Sie die Zip-Datei mit java.util.zip
  2. Lesen und schreiben Sie die Jar-Datei mit java.util.jar
  3. Arbeit mit RAR

1. Lesen und schreiben Sie die Zip-Datei mit java.util.zip

Um die Komprimierung und die Dekomprimierung zu handeln, bieten JDK Ihnen eine Package java.util.zip mit einigen Class
leider kann die Bibliothek die üblichen Format wie rar oder 7zip nicht lesen und dekomprimieren. Um die Format wie rar, 7zip, .. zu behandeln, brauchen Sie eine andere Bibliothek. In Unterlagen meine ich die anderen Bibliothek für Umgang mit dieser Arbeit .
Das ist eine Image von einer Zip file, die von dem Instrument Winrar. geöffnet wird
java.util.zip sieht die file in die Zip File als 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 {
			// Das Objekt ZipInputStream erstellen um die Zip File zu lesen.
			zipIs = new ZipInputStream(new FileInputStream(FILE_PATH));

			ZipEntry entry = null;
			// Jeder Entry durchsuchen (vom oben nach hinten bis zum Ende)
			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) {
			}
		}
	} 
}
Das Ergebnis von Beispiel
Beispiel: Dekomprimierung einer Zip File in einem Ordner
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";

		// Einen Output Verzeichnis wenn er existiert nicht.
		File folder = new File(OUTPUT_FOLDER);
		if (!folder.exists()) {
			folder.mkdirs();
		}
		// Einen Puffer erstellen (buffer).
		byte[] buffer = new byte[1024];

		ZipInputStream zipIs = null;
		try {
			// Ein Objekt ZipInputStream um die File aus einen Pfad zu lesen.
			zipIs = new ZipInputStream(new FileInputStream(FILE_PATH));

			ZipEntry entry = null;
			// Jeder Entry durchsuchen (vom oben nach hinten bis zum Ende)
			while ((entry = zipIs.getNextEntry()) != null) {
				String entryName = entry.getName();
				String outFileName = OUTPUT_FOLDER + File.separator + entryName;
				System.out.println("Unzip: " + outFileName);

				if (entry.isDirectory()) {
					// Die Verzeichnisse erstellen.
					new File(outFileName).mkdirs();
				} else {
					// Einen Stream erstellen um die Daten in die File zu schreiben.
					FileOutputStream fos = new FileOutputStream(outFileName);

					int len;
					// Die Daten auf die aktuellen Entry lesen
					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) {
			}
		}
	} 
}
Das Ergebni von dem Beispiel:
Einen Ordner komprimieren
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() {

	} 
	// Die Methode zur Komprimierung eines Verzeichnis.
	public void zipDirectory(File inputDir, File outputZipFile) {
		// Den Vaterverzeichnis für die Outputfile erstellen (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); 
			// Das Objekt ZipOutputStream erstellen um die Zip File zu aufschreiben
			fileOs = new FileOutputStream(outputZipFile);
			// 
			zipOs = new ZipOutputStream(fileOs);
			for (File file : allFiles) {
				String filePath = file.getAbsolutePath(); 
				System.out.println("Zipping " + filePath);
				// entryName: is a relative path.
				String entryName = filePath.substring(inputDirPath.length() + 1);

				ZipEntry ze = new ZipEntry(entryName);
				// Ein Entry in die Zip File einfügen.
				zipOs.putNextEntry(ze);
				// Die Daten der File lesen und in ZipOutputStream aufschreiben.
				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) {
		}
	} 
	// Die Methode gibt die Liste der File zurück, einschließend die Sub-File der Outputverzeichnis
	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); 
	}
}
Das Ergebnis von dem Beispiel

2. Lesen und schreiben Sie die Jar-Datei mit java.util.jar

Auf dem Wesen ist das Lesen und Schreiben einer jar file nicht unterschiedlich mit der Zip file.
  • JarInputStream wird aus ZipInputStream ausgeweitert und unterstützt die Funktion vom Lesen der Information MANIFEST.
  • JarOutputStream wird aus ZipOutputStream ausgeweitert und unterstützt die Funktion vom Schreiben der Information MANIFEST.
Die üblichen Bibliothek jar file von Java hat die sehr einfachen Information MANIFEST .
Das unten Beispiel: eine File MANIFEST.MF , die in einer jar file von der Applikaton RAP eingepackt wird, hat mehre Information
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
Ein Beispiel von der Öffnung einer jar file mit Winrar:
Die Elemente in die jar file werden als JarEntry.gesehen
Ein einfaches Beispiel vom Lesen der Information MANIFEST von einer jar file. Unten ist die Image von der Inhalt einer einfachen File Manifest
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 {
			// Das Objekt JarInputStream erstellen um die File jar zu lesen.
			zipIs = new JarInputStream(new FileInputStream(FILE_PATH)); 
			// Die Information Manifest lesen
			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;
			// Jeder Entry durchsuchen (vom oben nach hinten zum Ende)
			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) {
			}
		}
	} 
}
Das Ergebnis von dem Beispiel

3. Arbeit mit RAR

Sie brauchen eine Open Source Code Bibliothek, um die Rar file zu bearbeiten. Sie können die folgenden Bibliothek benutzen. Sie werden nach der abnehmenden Reihenfolge geschätzt
In diesem Unterlagen gebe ich die Hinweise bei der Benutzung von JUnRar (Die Version bei der Zeitpunkt 9-2014 ist die Version 0.7)
Download junrar:

Java Grundlagen

Show More