常见压缩文件格式:
压缩文件可以采用多种不同的格式进行存储,每种格式都有其特点和适用场景。
- zip:最常见的压缩文件格式之一,Windows系统内置了对zip格式的支持。
- rar:另一种广泛使用的压缩文件格式,具有较高的压缩率。
String path = "F:\\tt\\实验案例.rar";
// String path = "F:\\tt\\实验案例.zip";
if (path.endsWith(".zip")) {
unzip(path);
} else if (path.endsWith(".rar")) {
unrar(path);
}
一、这段代码实现了zip格式文件的【解压】功能。
它首先检查解压目标目录是否存在,如果存在则删除,然后创建新的目录。接着,它使用【ZipInputStream】
读取zip文件,并遍历其中的所有条目。对于每个条目,它会在目标目录中创建相应的文件或目录,并将条目内容写入新创建的文件中。如果在处理过程中发生异常,它会打印堆栈跟踪。
unzip
方法的实现步骤:
- 创建源文件对象:
- 根据提供的路径创建一个
File
对象,表示要解压的 ZIP 文件。
- 根据提供的路径创建一个
- 确定解压目录:
- 从 ZIP 文件名中去除扩展名,得到解压后的根目录名。
- 在 ZIP 文件所在的父目录中创建这个根目录。
- 删除已存在的解压目录:
- 如果解压目录已经存在,则使用
FileUtils.deleteDirectory
方法删除它。
- 如果解压目录已经存在,则使用
- 创建解压目录:
- 使用
mkdir
方法创建解压后的根目录。
- 使用
- 解压 ZIP 文件:
- 使用
ZipInputStream
读取 ZIP 文件。 - 遍历 ZIP 文件中的每个条目(子目录或子文件)。
- 对于每个条目,创建一个对应的
File
对象,并在物理磁盘上创建相应的子目录或子文件。 - 如果条目是文件,则读取其内容并写入新创建的文件中。
- 使用
- 异常处理:
- 捕获并处理可能发生的
FileNotFoundException
和IOException
。
- 捕获并处理可能发生的
// 解压缩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写入新子文件中
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) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
一、这段代码实现了rar格式文件的【解压】功能。
这个方法首先创建了一个解压目录,然后读取RAR文件中的所有子目录和子文件,按照文件名排序,遍历列表,为每个子目录或子文件创建对应的目录或文件,并将RAR文件中的子文件内容复制到新创建的文件中,最后打印所有子目录或子文件的名称。如果在解压过程中发生异常,则打印异常堆栈。
unrar
方法的实现步骤:
- 创建解压目录:
- 类似于
unzip
方法,根据 RAR 文件名确定解压后的根目录名,并在父目录中创建它。
- 类似于
- 删除已存在的解压目录:
- 如果解压目录已经存在,则使用
FileUtils.deleteDirectory
方法删除它。
- 如果解压目录已经存在,则使用
- 读取 RAR 文件:
- 使用
Archive
类(来自某个 RAR 处理库)读取 RAR 文件。
- 使用
- 获取文件头列表:
- 从 RAR 文件中获取所有子目录和子文件的文件头列表。
- 排序文件头列表:
- 根据文件名对文件头列表进行排序。
- 解压 RAR 文件:
- 遍历排序后的文件头列表。
- 对于每个文件头,创建一个对应的
File
对象,并在物理磁盘上创建相应的子目录或子文件。 - 如果文件头是文件,则获取其输入流,并将内容复制到新创建的文件中。
- 打印文件名:
- 遍历文件头列表,打印每个子目录或子文件的名称。
- 异常处理:
- 捕获并处理可能发生的
RarException
和IOException
。
- 捕获并处理可能发生的
// 解压缩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) {
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);
}
}
for (FileHeader fd : fileheaderList) {
System.out.println(fd.getFileName());
}
} catch (RarException | IOException e) {
e.printStackTrace();
}
这两个方法都遵循了类似的步骤:创建解压目录、删除已存在的解压目录(如果需要)、读取压缩文件、遍历压缩文件中的条目、在物理磁盘上创建对应的子目录或子文件,并处理可能发生的异常。