包java.util.zip
提供了用于读取和编写zip和gzip文件格式的类。
在这篇文章中,我们将学习如何以zip格式压缩文件和目录。 ZipOutputStream
类用于将zip格式的数据写入输出流。 zip文件包含多个由ZipEntry
类表示的条目。
压缩文件
以下是压缩文件的示例。文件:ZipFileExample.java -
package com.yiibai.tutorial.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* @author yiibai
*/
public class ZipFileExample {
public static void main(String[] args) {
// Output zip file
File zipfile = new File("MyFile.zip");
// Input file to be compressed
File inFile = new File("file.txt");
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
ZipOutputStream zipOutputStream = null;
try {
fileInputStream = new FileInputStream(inFile);
fileOutputStream = new FileOutputStream(zipfile);
zipOutputStream = new ZipOutputStream(fileOutputStream);
// Create ZipEntry
ZipEntry entry = new ZipEntry(inFile.getName());
// Set position of stream to the start of entry data
zipOutputStream.putNextEntry(entry);
// Write data to zipOutputStream
byte[] data = new byte[1024];
int i;
while ((i = fileInputStream.read(data)) != -1) {
zipOutputStream.write(data, 0, i);
}
// Closes the current ZIP entry and positions the stream for writing
// the next entry
zipOutputStream.closeEntry();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fileInputStream != null) {
fileInputStream.close();
}
if (zipOutputStream != null) {
zipOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
压缩目录中的所有文件和子目录
此示例以递归方式遍历目录中的所有文件,并使用ZipOutputStream
将其写入zip文件。
文件:ZipDirectoryExample.java -
package com.yiibai.tutorial.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* @author yiibai
*/
public class ZipDirectoryExample {
public static void main(String[] args) {
File zipFile = new File("MyZip.zip");
File directory = new File("D:/Work/java");
FileOutputStream fileOutputStream = null;
ZipOutputStream zipOutputStream = null;
try {
fileOutputStream = new FileOutputStream(zipFile);
zipOutputStream = new ZipOutputStream(fileOutputStream);
// Create zip file
createZipFile(zipOutputStream, directory, directory.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (zipOutputStream != null) {
zipOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* @param zipOutputStream
* @param directory
* @throws IOException
*/
private static void createZipFile(ZipOutputStream zipOutputStream, File directory, String zipEntryPath) throws IOException {
File[] files = directory.listFiles();
for (File file : files) {
if (file.isDirectory()) {
createZipFile(zipOutputStream, file, zipEntryPath);
} else {
FileInputStream fileInputStream = new FileInputStream(file);
// Create zipEntry
String filePath = file.getAbsolutePath();
ZipEntry entry = new ZipEntry(filePath.replace(zipEntryPath + File.separator, ""));
// Set position of stream to the start of entry data
zipOutputStream.putNextEntry(entry);
// Write data to zip output stream
byte data[] = new byte[1024];
int i;
while ((i = fileInputStream.read(data)) != -1) {
zipOutputStream.write(data, 0, i);
}
// Closes the current ZIP entry
zipOutputStream.closeEntry();
// Close file stream
fileInputStream.close();
}
}
}
}