betacode

Сжатие и декомпрессия в Java

  1. Чтение запись файла zip используя java.util.zip
  2. Чтение запись файла jar используя java.util.jar
  3. Обработка файла RAR

1. Чтение запись файла zip используя java.util.zip

Для сжатия и извлечения файлов JDK дает вам пакет java.util.zip с некоторыми классами, чтобы сделать это.

К сожалению, эта библиотека не может сжимать и извлекать популярные форматы, такие как RAR или 7zip. Для обработки формата rar, 7zip, .. вам нужна другая библиотека. В этом документе я говорю об этих библиотеках, чтобы сделать это.
Это изображения ZIP-файла, который открывается с помощью инструмента WinRAR.
java.util.zip считает эти файлы в zip-файле как 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 {
			// Создать объект ZipInputStream для чтения zip файла.
			zipIs = new ZipInputStream(new FileInputStream(FILE_PATH));

			ZipEntry entry = null;
			// Просмотр каждого Entry (С верха до низу, до конца)
			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) {
			}
		}
	} 
}
Результат запуска примера:
Пример извлечения zip-файла в определенную папку:
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";

		// Создать папку Output если она не существует.
		File folder = new File(OUTPUT_FOLDER);
		if (!folder.exists()) {
			folder.mkdirs();
		}
		// Создать buffer (Буфер).
		byte[] buffer = new byte[1024];

		ZipInputStream zipIs = null;
		try {
			// Создать объект ZipInputStream для чтения файла из 1 пути (path).
			zipIs = new ZipInputStream(new FileInputStream(FILE_PATH));

			ZipEntry entry = null;
			// Просмотр каждого Entry (С верзу до низу, до конца)
			while ((entry = zipIs.getNextEntry()) != null) {
				String entryName = entry.getName();
				String outFileName = OUTPUT_FOLDER + File.separator + entryName;
				System.out.println("Unzip: " + outFileName);

				if (entry.isDirectory()) {
					// Создать папки.
					new File(outFileName).mkdirs();
				} else {
					// Создать Stream для записи данных в файл.
					FileOutputStream fos = new FileOutputStream(outFileName);

					int len;
					// Чтение данных на текущем Entry.
					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) {
			}
		}
	} 
}
Результат запуска примера:
Сжатие каталога
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() {

	} 
	// Метод для сжатия папки.
	public void zipDirectory(File inputDir, File outputZipFile) {
		// Создать родительскую папку для выходного файла (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); 
			// Создать объект ZipOutputStream для записи zip файла.
			fileOs = new FileOutputStream(outputZipFile);
			// 
			zipOs = new ZipOutputStream(fileOs);
			for (File file : allFiles) {
				String filePath = file.getAbsolutePath(); 
				System.out.println("Zipping " + filePath);
				// entryName: это относительный путь.
				String entryName = filePath.substring(inputDirPath.length() + 1);

				ZipEntry ze = new ZipEntry(entryName);
				// Добавить entry в zip файл.
				zipOs.putNextEntry(ze);
				// Чтение данных файла и записать в 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) {
		}
	} 
	// Данный метод возвращает список файлов, включая подфайлы ... входной папки
	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); 
	}
}
Результат запуска примера:

2. Чтение запись файла jar используя java.util.jar

В основном чтение, запись файла jar ничем не отличается от чтения, записи Zip-файла.
  • JarInputStream расширяется из ZipInputStream, поддерживает больше методов для чтения информации MANIFEST.
  • JarOutputStream расширяется из ZipOutputStream, поддерживает больше методов для записи информации MANIFEST
Обычные файлы библиотеки jar в java имеют очень простую информацию MANIFEST.
Например это файл MANIFEST.MF упакованный в файле jar приложения RAP имеющего больше информации:
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
Например, файл jar открывает с помощью Winrar:
Объекты в файле jar считаются JarEntry.
Простой пример чтения файла MANIFEST файла jar. Ниже приведено изображение содержания простого файла 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 {
			// Создать объект JarInputStream для чтения jar файлов.
			zipIs = new JarInputStream(new FileInputStream(FILE_PATH)); 
			// Прочитать информацию 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;
			// Просмотр каждого Entry (С верху до низу, до конца)
			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) {
			}
		}
	} 
}
Результат запуска примера:

3. Обработка файла RAR

Для работы с RAR-файлом необходима библиотека с открытым исходным кодом. Вы можете использовать одну из следующих библиотек, c хорошей оценкой по убыванию.
В этой статье я расскажу вам, как использовать JUnRar (Версию на данный момент 9-2014 является 0.7)
Download junrar:

Java Basic

Show More