Сжатие и декомпрессия в Java
1. Чтение запись файла zip используя java.util.zip
Для сжатия и извлечения файлов JDK дает вам пакет java.util.zip с некоторыми классами, чтобы сделать это.
К сожалению, эта библиотека не может сжимать и извлекать популярные форматы, такие как RAR или 7zip. Для обработки формата rar, 7zip, .. вам нужна другая библиотека. В этом документе я говорю об этих библиотеках, чтобы сделать это.
К сожалению, эта библиотека не может сжимать и извлекать популярные форматы, такие как 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 имеющего больше информации:
Например это файл 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
- Настройте java compiler для обработки вашего Annotation (Annotation Processing Tool)
- Программирование на Java для группы с помощью Eclipse и SVN
- Руководство Java WeakReference
- Руководство Java PhantomReference
- Сжатие и декомпрессия в Java
- Настройка Eclipse для использования JDK вместо JRE
- Методы String.format() и printf() в Java
- Синтаксис и новые функции в Java 8
- Регулярные выражения Java
- Руководство Java Multithreading Programming
- Библиотеки Java JDBC Driver для различных типов баз данных
- Руководство Java JDBC
- Получить значения столбцов, автоматически возрастающих при вставлении (Insert) записи, используя JDBC
- Руководство Java Stream
- Руководство Java Functional Interface
- Введение в Raspberry Pi
- Руководство Java Predicate
- Абстрактный класс и Interface в Java
- Модификатор доступа (Access modifiers) в Java
- Руководство Java Enum
- Руководство Java Annotation
- Сравнение и Сортировка в Java
- Руководство Java String, StringBuffer и StringBuilder
- Обработка исключений Java - Java Exception Handling
- Руководство Java Generics
- Манипулирование файлами и каталогами в Java
- Руководство Java BiPredicate
- Руководство Java Consumer
- Руководство Java BiConsumer
- Что мне нужно для начала работы с Java?
- История Java и разница между Oracle JDK и OpenJDK
- Установить Java в Windows
- Установите Java в Ubuntu
- Установите OpenJDK в Ubuntu
- Установить Eclipse
- Установите Eclipse в Ubuntu
- Быстрое изучение Java для начинающих
- История бит и байтов в информатике
- Типы данных в java
- Битовые операции
- Команда if else в Java
- команды switch в Java
- Циклы в Java
- Массивы (Array) в Java
- JDK Javadoc в формате CHM
- Наследование и полиморфизм в Java
- Руководство Java Function
- Руководство Java BiFunction
- Пример Java encoding и decoding с использованием Apache Base64
- Руководство Java Reflection
- Java Удаленный вызов методов - Java RMI
- Руководство Программирование Java Socket
- Какую платформу я должен выбрать для разработки приложений Java Desktop?
- Руководство Java Commons IO
- Руководство Java Commons Email
- Руководство Java Commons Logging
- Понимание Java System.identityHashCode, Object.hashCode и Object.equals
- Руководство Java SoftReference
- Руководство Java Supplier
- Аспектно-ориентированное программирование Java с помощью AspectJ (AOP)
Show More
- Руководства Java Servlet/JSP
- Руководства Java Collections Framework
- Java API для HTML, XML
- Руководства Java IO
- Руководства Java Date Time
- Руководства Spring Boot
- Руководства Maven
- Руководства Gradle
- Руководства Java Web Services
- Руководства Java SWT
- Руководства JavaFX
- Руководства Oracle Java ADF
- Руководства Struts2 Framework
- Руководства Spring Cloud