admin 管理员组

文章数量: 1184232

我们常用的压缩文件有两种:后缀为.zip或者.rar,接下来将介绍解析两种压缩文件的代码。需要用到三个jar包:commons-io-2.16.1.jar、junrar-7.5.5.jar、slf4j-api-2.0.13.jar,可以在官网下载,也可以发私信。

这段代码是一个Java程序,包含了一个 main 方法和一个 unzip 方法。在 main 方法中,通过传入一个文件路径( path ),判断该文件是以 .zip 结尾还是其他类型的文件,并根据不同的情况调用 unzip 方法或 unrar 方法进行解压缩。

1、后缀为.zip的压缩文件

unzip 方法主要实现了解压缩 zip 格式文件的功能。它首先根据传入的文件路径创建一个 File 对象,然后根据该文件对象获取根目录的路径,并判断根目录是否已经存在,如果存在则删除该目录(使用 FileUtils 工具类删除)。接着创建根目录,并使用 ZipInputStream 来读取压缩文件中的内容,遍历每个子目录或子文件( ZipEntry 对象),然后根据每个子目录或子文件创建相应的 File 对象,并在物理磁盘上创建子目录或文件,最后将压缩文件中的内容写入到新创建的子文件中。

需要注意的是,该代码使用了 FileUtils ZipInputStream 来处理文件和解压缩操作,同时捕获了可能抛出的 IOException 异常并进行了处理。

public class Demo {
    public static void main(String[] args) {
        String path="D:\\Ayjy\\001\\easyftp-server-1.7.0.10-cn.zip";
        if (path.endsWith(".zip")) {
            unzip(path);
        } else {
            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写入新的子文件中
                    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();
        }
    }

此处必须为-1

因为当文件读取完成时,会出现以下结果:

2、后缀为.rar的压缩文件

unrar()方法和unzip()方法一起写在Demo类中

unrar()方法实现了解压缩 rar 格式文件的功能。首先根据传入的文件路径创建一个 File 对象表示待解压缩的 rar 文件,并通过该文件对象获取根目录的路径。如果根目录已经存在,则使用 FileUtils 工具类删除该目录;接着创建新的根目录。

然后通过创建 Archive 对象,使用 FileInputStream 读取 rar 压缩文件格式。通过 getFileHeaders() 方法获取压缩文件中的所有子目录或子文件( FileHeader 对象),并将其按照名称排序。接着遍历子目录和子文件,创建新的子目录或文件,并将压缩文件中的内容写入新创建的子文件中。

在处理异常时,捕获了可能抛出的 FileNotFoundException RarException IOException 异常,并进行相应的处理。这段代码主要使用了 Archive 类来读取 rar 文件内容,以及 FileUtils 类来处理文件操作。

//解压缩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().indexOf(".")));
        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 (FileNotFoundException e) {
            e.printStackTrace();
        } catch (RarException | IOException e) {
            e.printStackTrace();
        }
    }

本文标签: 文件 子文件 编程