zip压缩文件
/* 下列代码通过ZipOutputStream类创建了一个ZIP输出流,并指定输出的ZIP文件路径。
* 然后,通过递归调用zipFile方法,将源目录中的文件和目录逐个添加到ZIP文件中。
*/
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;
public class ZipExample {
public static void main(String[] args) {
String sourceDir = "path/to/source/directory";
String zipFile = "path/to/output/zipfile.zip";
try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile))) {
File fileToZip = new File(sourceDir);
zipFile(fileToZip, fileToZip.getName(), zipOut);
} catch (IOException e) {
e.printStackTrace();
}
}
private static void zipFile(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException {
if (fileToZip.isHidden()) {
return;
}
if (fileToZip.isDirectory()) {
File[] children = fileToZip.listFiles();
for (File childFile : children) {
zipFile(childFile, fileName + "/" + childFile.getName(), zipOut);
}
} else {
byte[] buffer = new byte[1024];
FileInputStream fis = new FileInputStream(fileToZip);
zipOut.putNextEntry(new ZipEntry(fileName));
int length;
while ((length = fis.read(buffer)) >= 0) {
zipOut.write(buffer, 0, length);
}
fis.close();
}
}
}
zip解压缩文件
/* 下列代码通过ZipInputStream类创建了一个ZIP输入流,并指定输入的ZIP文件路径。
* 然后,通过循环读取ZIP输入流中的条目,并根据条目的类型进行相应的处理,实现了对ZIP文件的解压缩操作。
*/
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class UnzipExample {
public static void main(String[] args) {
String zipFile = "path/to/zipfile.zip";
String outputDir = "path/to/output/directory";
try (ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFile))) {
ZipEntry entry = zipIn.getNextEntry();
while (entry != null) {
String filePath = outputDir + File.separator + entry.getName();
if (!entry.isDirectory()) {
extractFile(zipIn, filePath);
} else {
File dir = new File(filePath);
dir.mkdirs();
}
zipIn.closeEntry();
entry = zipIn.getNextEntry();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static void extractFile(ZipInputStream zipIn, String filePath) throws IOException {
byte[] buffer = new byte[1024];
FileOutputStream fos = new FileOutputStream(filePath);
int length;
while ((length = zipIn.read(buffer)) >= 0) {
fos.write(buffer, 0, length);
}
fos.close();
}
}
https://www.cnblogs.com/peashooter/p/9455498.html
https://www.cnblogs.com/0616--ataozhijia/p/5022028.html
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
// 定义一个类来关联 OutputStream 和文件名
class OutputStreamWithName {
OutputStream outputStream;
String originalFileName;
public OutputStreamWithName(OutputStream outputStream, String originalFileName) {
this.outputStream = outputStream;
this.originalFileName = originalFileName;
}
}
public class OutputStreamListCompression {
public static void main(String[] args) {
// 创建一个 OutputStreamWithName 列表
List<OutputStreamWithName> outputStreamList = new ArrayList<>();
ByteArrayOutputStream baos1 = new ByteArrayOutputStream();
ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
try {
// 向 OutputStream 中写入一些示例数据
baos1.write("Hello, world!".getBytes());
baos2.write("This is another piece of data.".getBytes());
// 添加 OutputStream 及其原始文件名
outputStreamList.add(new OutputStreamWithName(baos1, "original1.txt"));
outputStreamList.add(new OutputStreamWithName(baos2, "original2.txt"));
// 创建一个文件输出流,用于写入压缩文件
FileOutputStream fos = new FileOutputStream("compressed.zip");
ZipOutputStream zos = new ZipOutputStream(fos);
// 遍历 OutputStream 列表,将每个流的内容写入压缩文件,并修改文件名
for (int i = 0; i < outputStreamList.size(); i++) {
OutputStreamWithName streamWithName = outputStreamList.get(i);
ByteArrayOutputStream baos = (ByteArrayOutputStream) streamWithName.outputStream;
byte[] data = baos.toByteArray();
// 修改文件名,这里简单在原文件名前加 "new_"
String newFileName = "new_" + streamWithName.originalFileName;
ZipEntry entry = new ZipEntry(newFileName);
zos.putNextEntry(entry);
zos.write(data);
zos.closeEntry();
}
// 关闭压缩输出流和文件输出流
zos.close();
fos.close();
System.out.println("Compression completed successfully.");
} catch (IOException e) {
e.printStackTrace();
}
}
}