解压
当我们拿到一个压缩文件,如下
现下常见的两种压缩格式,zip和rar。那么针对格式的不同,他们使用的jar包和方法也有所不同。
解压zip格式文件
一.技术准备
需要使用到第三方jar包
1.Apache软件基金会属于第三方,使用第三方开发出来的工具,都需要添加第三方提供给我们的jar包
2.jar包:本身是一个压缩包,里面转的都是class文件,我们想使用jar包中的工具类,就需要将相应的jar包解压到我们的当前项目下
3.怎么引入jar包
a.在当前模块下创建文件夹,取名为lib
b.将准备好的jar包,放到此文件夹下
c.对着jar包,右键 -> Build Path -> add as library
d.level可以选择module,此时上面叫做name的输入框会变成空的,不用管
e.直接点ok
二、代码实现
public class Test {
public static void main(String[] args) {
String path = "D:\\Test\\easyftp-server-1.7.0.10-cn.zip";
unzip(path);
}
// zip文件解压缩
public static void unzip(String path) {
// 1.1根据原始路径创建源文件
File sourceFlie = new File(path);
// 1.2根目录
String sourceFlieName = sourceFlie.getName();
File rootDir = new File(
sourceFlie.getParent() + "\\" + sourceFlieName.substring(0, sourceFlieName.lastIndexOf(".")));
// 判断根目录是否存在
if (rootDir.exists()) {
// 如果存在,则删除
// l rootDir.delete();//仅能删除空目录
// 使用commons-io包提供的FileUtils工具类进行删除
try {
FileUtils.deleteDirectory(rootDir);
} catch (IOException e) {
e.printStackTrace();
}
}
// 1.3创建根目录
rootDir.mkdir();
// ZipInputStream:用于进行zip格式的压缩文件输入流
try (ZipInputStream in = new ZipInputStream(new FileInputStream(sourceFlie));) {
// 遍历压缩包中每个子目录或子文件(ZipEntry类型的对象)
ZipEntry zipEntry = null;
while ((zipEntry = in.getNextEntry()) != null) {
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 (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
解压rar格式文件
需要使用到第三方包:slf4j-api-2.0.13.jar、junrar-7.5.5.jar.
jar包的导入方法同上
代码实现
public class Test {
public static void main(String[] args) {
String path = "D:\\Test\\实验案例.rar";
unrar(path);
}
// rar文件解压缩
public static void unrar(String path) {
// 1.创建解压缩的根目录
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) {
// TODO Auto-generated catch block
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 e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
压缩
public class Test {
public static void main(String[] args) {
// 所在目录
File dir = new File("D:\\Test");
// 获取所有原始子文件
File[] files = dir.listFiles();
// 创建zip压缩文件的输出流
try (ZipOutputStream out = new ZipOutputStream(
new FileOutputStream(dir.getPath() + "\\" + dir.getName() + ".zip"))) {
// 遍历所有子文件
for (File f : files) {
// 写入一个压缩包中的子文件
out.putNextEntry(new ZipEntry(f.getName()));
// 写入字节内容
out.write(Files.readAllBytes(f.toPath()));
// 关闭压缩包中子文件
out.closeEntry();
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}