目录
在Java中,可以使用标准库中的java.util.zip包来进行文件压缩和解压缩。最常见的两种格式分别为zip和rar。以下是使用java.util.zip包进行文件压缩和解压缩的常见步骤:
解压缩zip格式
导入相关类:
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public static void unzip(String path){
//根据原始路径(字符串),创建源文件(File对象)
File sourceFile = new File(path);
//根目录
String sourceFileName = sourceFile.getName();
File rootDir = new File(sourceFile.getParent()+"\\"+sourceFileName.substring(0,sourceFileName.lastIndexOf(".")));
//判断根目录是否存在
if(rootDir.exists()) {
//如果存在,则删除
//rootDir.delete();//仅能删除空目录
//使用commons-io包提供的FileUtils工具类进行删除
try {
FileUtils.deleteDirectory(rootDir);
} catch (IOException e) {
e.printStackTrace();
}
}
创建根目录:
//创建根目录
rootDir.mkdir();
ZipInputStream:用于进行zip格式的压缩文件输入流。
try(ZipInputStream in = new ZipInputStream(new FileInputStream(sourceFile))) {
//遍历压缩包中每个子目录或子文件(ZipEntry类型的对象)
ZipEntry zipEntry = null;
while((zipEntry = in.getNextEntry()) != null) {
//创建子目录或子文件(File对象)
File file = new File(rootDir.getPath() + "\\" + zipEntry.getName());
if(zipEntry.isDirectory()) {
// 物理磁盘创建子目录
file.mkdir();
}else {
// 物理磁盘创建子文件
file.createNewFile();
//读取当前压缩包中的子文件,并通过输出流out写入新子文件中
FileOutputStream out = new FileOutputStream(file);
byte[] buff = new byte[1024];
int len=-1;
while((len = in.read(buff)) != -1) {
out.write(buff,0,len);
}
}
//System.out.println(zipEntry.getName());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
解压rar格式
解压rar格式与解压zip格式基本相同,代码如下:
导入相关类:
import com.github.junrar.Archive;
import com.github.junrar.exception.RarException;
import com.github.junrar.rarfile.FileHeader;
public static void unrar(String path){
File rarFile = new File(path);
File rootDir = new File(rarFile.getParent()+ "\\" +rarFile.getName().substring(0,rarFile.getName().lastIndexOf(".")));
if(rootDir.exists()) {
try {
FileUtils.deleteDirectory(rootDir);
} catch (IOException e) {
e.printStackTrace();
}
}
创建根目录:
rootDir.mkdir();
Archive:创建Archive对象,用于读取rar压缩文件格式。
try (Archive archive = new Archive(new FileInputStream(path))){
List<FileHeader> fileheaderList = archive.getFileHeaders();
fileheaderList.sort(new Comparator<FileHeader>() {
@Override
public int compare(FileHeader o1, FileHeader o2) {
return o1.getFileName().compareTo(o2.getFileName());
}
});
for(FileHeader fd : fileheaderList) {
File f = new File(rootDir.getPath() + "\\" + fd.getFileName());
if(fd.isDirectory()) {
//创建新子目录
f.mkdir();
}else {
//创建新子文件
f.createNewFile();
//获取压缩包中的子文件输入流
InputStream in = archive.getInputStream(fd);
// 复制文件输入流到新子文件
FileUtils.copyInputStreamToFile(in, f);
}
}
} catch (RarException | IOException e) {
e.printStackTrace();
}
}
完整代码
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Comparator;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.apache.commons.io.FileUtils;
import com.github.junrar.Archive;
import com.github.junrar.exception.RarException;
import com.github.junrar.rarfile.FileHeader;
public class Test02 {
public static void main(String[] args) {
//String path = "D:\\test\\io\\easyftp-server-1.7.0.10-cn.zip";
String path = "D:\\test\\实验案例.rar";
if(path.endsWith(".zip")) {
unzip(path);
}else if(path.endsWith(".rar")) {
unrar(path);
}
}
//解压缩zip格式
public static void unzip(String path){
//根据原始路径(字符串),创建源文件(File对象)
File sourceFile = new File(path);
//根目录
String sourceFileName = sourceFile.getName();
File rootDir = new File(sourceFile.getParent()+"\\"+sourceFileName.substring(0,sourceFileName.lastIndexOf(".")));
//判断根目录是否存在
if(rootDir.exists()) {
//如果存在,则删除
//rootDir.delete();//仅能删除空目录
//使用commons-io包提供的FileUtils工具类进行删除
try {
FileUtils.deleteDirectory(rootDir);
} catch (IOException e) {
e.printStackTrace();
}
}
//创建根目录
rootDir.mkdir();
//ZipInputStream:用于进行zip格式的压缩文件输入流
try(ZipInputStream in = new ZipInputStream(new FileInputStream(sourceFile))) {
//遍历压缩包中每个子目录或子文件(ZipEntry类型的对象)
ZipEntry zipEntry = null;
while((zipEntry = in.getNextEntry()) != null) {
//创建子目录或子文件(File对象)
File file = new File(rootDir.getPath() + "\\" + zipEntry.getName());
if(zipEntry.isDirectory()) {
// 物理磁盘创建子目录
file.mkdir();
}else {
// 物理磁盘创建子文件
file.createNewFile();
//读取当前压缩包中的子文件,并通过输出流out写入新子文件中
FileOutputStream out = new FileOutputStream(file);
byte[] buff = new byte[1024];
int len=-1;
while((len = in.read(buff)) != -1) {
out.write(buff,0,len);
}
}
//System.out.println(zipEntry.getName());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//解压rar格式
public static void unrar(String path){
File rarFile = new File(path);
File rootDir = new File(rarFile.getParent()+ "\\" +rarFile.getName().substring(0,rarFile.getName().lastIndexOf(".")));
if(rootDir.exists()) {
try {
FileUtils.deleteDirectory(rootDir);
} catch (IOException e) {
e.printStackTrace();
}
}
rootDir.mkdir();
//创建Archive对象,用于读取rar压缩文件格式
try (Archive archive = new Archive(new FileInputStream(path))){
List<FileHeader> fileheaderList = archive.getFileHeaders();
fileheaderList.sort(new Comparator<FileHeader>() {
@Override
public int compare(FileHeader o1, FileHeader o2) {
return o1.getFileName().compareTo(o2.getFileName());
}
});
for(FileHeader fd : fileheaderList) {
File f = new File(rootDir.getPath() + "\\" + fd.getFileName());
if(fd.isDirectory()) {
//创建新子目录
f.mkdir();
}else {
//创建新子文件
f.createNewFile();
//获取压缩包中的子文件输入流
InputStream in = archive.getInputStream(fd);
// 复制文件输入流到新子文件
FileUtils.copyInputStreamToFile(in, f);
}
}
} catch (RarException | IOException e) {
e.printStackTrace();
}
}
}
小结
这两种方式都需要在代码中指定输入压缩文件的路径,并通过相应的输入流类进行解析和处理。根据需求可以灵活使用这些类和方法来完成更复杂的操作。