Java实现文件压缩和解压
要压缩和解压,可以使用Java中的压缩库,如java.util.zip
或org.apache.commons.compress
ZipOutputStream(压缩流)此类为以 ZIP 文件格式写入文件实现输出流过滤器。
ZipInputStream(解压流)此类为读取 ZIP 文件格式的文件实现输入流过滤器。
话不多说代码如下:
package file;
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class FileCompressor {
public static void main(String[] args) {
File[] files = {new File("F:\\a\\66\\测试哈哈哈111.docx")};
String zipFilePath = "compressed.zip";
try {
compressFiles(files, zipFilePath);
System.out.println("Files compressed successfully.");
} catch (IOException e) {
e.printStackTrace();
}
// String zipFilePath = "F:/批量下载测试_系统管理员_202307040952.zip";
// String destDir = "F:/a";
//
// try {
// extractFiles(zipFilePath, destDir);
// System.out.println("Files extracted successfully.");
// } catch (IOException e) {
// e.printStackTrace();
// }
}
/**
* 压缩文件
*
* @param files 文件数组
* @param zipFilePath 压缩文件路径
* @throws IOException
*/
public static void compressFiles(File[] files, String zipFilePath) throws IOException {
//try-with-resources会自动关闭FileInputStream,无需手动调用close()方法
try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFilePath))) {
for (File file : files) {
addToZip(file, file.getName(), zipOut);
}
}
}
private static void addToZip(File file, String fileName, ZipOutputStream zipOut) throws IOException {
try (FileInputStream fis = new FileInputStream(file)) {
//使用指定名称创建新的 ZIP 条目
ZipEntry zipEntry = new ZipEntry(fileName);
//写入新的 ZIP 文件条目
zipOut.putNextEntry(zipEntry);
//写入当前条目所对应的具体内容
byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
zipOut.write(bytes, 0, length);
}
}
}
/**
* 解压文件
*
* @param zipFilePath 压缩文件路径
* @param destDir 目标目录路径
* @throws IOException
*/
public static void extractFiles(String zipFilePath, String destDir) throws IOException {
try (ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath))) {
ZipEntry entry;
while ((entry = zipIn.getNextEntry()) != null) {
//返回条目名称
String filePath = destDir + File.separator + entry.getName();
//如果为目录条目,则返回 true
if (!entry.isDirectory()) {
extractFile(zipIn, filePath);
} else {
//mkdirs()方法创建一个文件夹和它的所有父文件夹
File dir = new File(filePath);
dir.mkdirs();
}
zipIn.closeEntry();
}
}
}
private static void extractFile(ZipInputStream zipIn, String filePath) throws IOException {
File file = new File(filePath);
//返回此抽象路径名父目录的抽象路径名
File parentDir = file.getParentFile();
//测试此抽象路径名表示的文件或目录是否存在
if (!parentDir.exists()) {
parentDir.mkdirs();
}
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file))) {
byte[] bytes = new byte[1024];
int length;
while ((length = zipIn.read(bytes)) >= 0) {
bos.write(bytes, 0, length);
}
}
}
}