分别将后缀名为".zip"和后缀名为".rar"的压缩包解压:
解压缩".zip":
1.根据原始路径,创建源文件
2.判断根目录是否存在,若存在,则删除
3.创建根目录
4.创建File对象类型的子目录或子文件
5.在物理磁盘上创建子目录或子文件
6.读取当前压缩包中的子文件,并通过输出流out写入新子文件中
解压缩".rar":
1.根据原始路径,创建源文件
2.判断根目录是否存在,若存在,则删除
3.创建根目录
4.创建Archive对象,用于读取rar压缩文件格式
5.获取压缩文件中的所有子目录或子文件
6.按照子目录(子文件)名称排序
7.遍历子目录和子文件......
public class Demo01 {
public static void main(String[] args) {
String path = "E:\\sxh\\easyftp-server-1.7.0.10-cn.zip";
String path = "E:\\sxh\\实验案例.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()) {
//如果存在,则删除
//通过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写入新子文件中
try(FileOutputStream out = new FileOutputStream(file);){
byte[] buff = new byte[1024];
int len = -1;
while((len = in.read(buff)) != -1) {
out.write(buff,0,len);
}
}
}
}
}catch(IOException e) {
e.printStackTrace();
}
}
//解压缩rar格式
public static void unrar(String path) {
//根据原始路径(字符串),创建源文件(File对象)
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))){
//获取压缩文件中的所有子目录或子文件(FileHeader对象)
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();
}
}
}
将文件压缩为".zip"文件:
1.获取原始子文件
2.创建zip压缩文件的输出流
3.遍历所有原始文件,写入一个压缩包中的子文件
4.写入字节内容
5.关闭压缩包中的子文件
public class Demo01 {
public static void main(String[] args) {
//文件所在目录
File dir = new File("E:\\sxh\\sxhlp");
//获取所有原始子文件
File[] files = dir.listFiles();
//创建zip压缩文件的输出流
try(ZipOutputStream out = new ZipOutputStream(new FileOutputStream(dir.getPath()+"\\"+dir.getName()+".zip"))){
//遍历所有原始子文件
for(File f : files) {
//写入一个压缩包中的子文件(ZipEntry对象)
out.putNextEntry(new ZipEntry(f.getName()));
//写入字节内容
out.write(Files.readAllBytes(f.toPath()));
//关闭压缩包中的子文件
out.closeEntry();
}
}catch (IOException e) {
e.printStackTrace();
}
}
}