java如何压缩文件
Java压缩文件的方法
Java提供了多种方式来压缩文件,常用的方法包括使用java.util.zip包中的ZipOutputStream和ZipEntry类。以下是一个完整的示例代码:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipFileExample {
public static void main(String[] args) {
String sourceFile = "example.txt";
String zipFileName = "compressed.zip";
try (FileOutputStream fos = new FileOutputStream(zipFileName);
ZipOutputStream zos = new ZipOutputStream(fos);
FileInputStream fis = new FileInputStream(sourceFile)) {
ZipEntry zipEntry = new ZipEntry(sourceFile);
zos.putNextEntry(zipEntry);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
zos.write(buffer, 0, length);
}
zos.closeEntry();
} catch (IOException e) {
e.printStackTrace();
}
}
}
压缩多个文件的方法
如果需要压缩多个文件到一个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 ZipMultipleFiles {
public static void main(String[] args) {
String[] filesToZip = {"file1.txt", "file2.txt", "file3.txt"};
String zipFile = "multipleFiles.zip";
try (FileOutputStream fos = new FileOutputStream(zipFile);
ZipOutputStream zos = new ZipOutputStream(fos)) {
for (String file : filesToZip) {
File fileToZip = new File(file);
try (FileInputStream fis = new FileInputStream(fileToZip)) {
ZipEntry zipEntry = new ZipEntry(fileToZip.getName());
zos.putNextEntry(zipEntry);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
zos.write(buffer, 0, length);
}
zos.closeEntry();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
压缩整个目录的方法
如果需要压缩整个目录及其子目录,可以使用递归方法:
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 ZipDirectory {
public static void main(String[] args) {
String sourceDir = "myDirectory";
String zipFile = "directory.zip";
try (FileOutputStream fos = new FileOutputStream(zipFile);
ZipOutputStream zos = new ZipOutputStream(fos)) {
File fileToZip = new File(sourceDir);
zipFile(fileToZip, fileToZip.getName(), zos);
} catch (IOException e) {
e.printStackTrace();
}
}
private static void zipFile(File fileToZip, String fileName, ZipOutputStream zos) throws IOException {
if (fileToZip.isHidden()) {
return;
}
if (fileToZip.isDirectory()) {
File[] children = fileToZip.listFiles();
for (File childFile : children) {
zipFile(childFile, fileName + "/" + childFile.getName(), zos);
}
return;
}
try (FileInputStream fis = new FileInputStream(fileToZip)) {
ZipEntry zipEntry = new ZipEntry(fileName);
zos.putNextEntry(zipEntry);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
zos.write(buffer, 0, length);
}
}
}
}
使用第三方库压缩文件
除了Java自带的java.util.zip包,还可以使用第三方库如Apache Commons Compress来压缩文件:
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ApacheZipExample {
public static void main(String[] args) throws IOException {
File fileToZip = new File("example.txt");
File zipFile = new File("compressed.zip");
try (FileOutputStream fos = new FileOutputStream(zipFile);
ZipArchiveOutputStream zaos = new ZipArchiveOutputStream(fos);
FileInputStream fis = new FileInputStream(fileToZip)) {
ZipArchiveEntry zipEntry = new ZipArchiveEntry(fileToZip, fileToZip.getName());
zaos.putArchiveEntry(zipEntry);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
zaos.write(buffer, 0, length);
}
zaos.closeArchiveEntry();
}
}
}
注意事项
压缩文件时需要注意文件路径问题,确保文件存在且有读取权限。对于大文件,建议使用缓冲区来提高性能。压缩过程中可能会抛出IOException,需要进行适当的异常处理。







