Java中zip的压缩和解压缩的实现代码

作者:admin 2021-02-25 浏览:851
导读: 在Java中可以使用ZipOutputStream和ZipInputStream来实现zip的压缩和解压缩操作,另外使用FileSystem也可以用来实现zip的解压缩,下面将介绍这几种方式,直接上代码。zip压缩待压缩文件目录结构:每个zip文件项都要对应一个ZipEntry,然后通过ZipOut...

在Java中可以使用ZipOutputStream和ZipInputStream来实现zip的压缩和解压缩操作,另外使用FileSystem也可以用来实现zip的解压缩,下面将介绍这几种方式,直接上代码。

zip压缩

待压缩文件目录结构:

每个zip文件项都要对应一个ZipEntry,然后通过ZipOutputStream的putNextEntry方法开始写入一个新的zip文件项,将文件数据发送到zip输出流中,完成后再调用closeEntry方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@Test
public void testCompressByZip() {
    try (
        //指定压缩完成后zip文件的存储路径
        ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream("F:\\myFavorites.zip"))
    )
    {
        //待压缩文件/目录所在的目录
        File fileFolder = new File("F:\\我的收藏");
        //获取目录下的所有文件
        File[] files = fileFolder.listFiles();
 
        ZipEntry zipEntry;
        byte[] byteArray;
        int len;
        //遍历目录下的所有文件/目录,并将它们添加到压缩文件中
        for (File file : files) {
            //一个ZipEntry对应压缩文件中的一项
            zipEntry = new ZipEntry(file.getName());
            zipOutputStream.putNextEntry(zipEntry);
            try (FileInputStream in = new FileInputStream(file)) {
                byteArray = new byte[1024];
                while ((len = in.read(byteArray)) != -1) {
                    zipOutputStream.write(byteArray, 0, len);
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            zipOutputStream.closeEntry();
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

压缩结果:

zip解压缩

遍历zip文件中的所有项,并获取对应项的输入流,然后通过FileOutputStream输出到指定目录中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Test
public void testDecompressByZip() {
    try (
        //指定需要解压缩的zip文件
        ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream("F:\\myFavorites.zip"))
    )
    {
        ZipEntry zipEntry;
        byte[] byteArray;
        int len;
        //遍历zip文件中的所有项,并逐个解压到指定的目录中
        while ((zipEntry = zipInputStream.getNextEntry()) != null) {
            try (FileOutputStream fileOutputStream = new FileOutputStream("F:\\我的解压目录\\" + zipEntry.getName())) {
                byteArray = new byte[1024];
                while ((len = zipInputStream.read(byteArray)) != -1) {
                    fileOutputStream.write(byteArray, 0, len);
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

解压缩结果:

使用FileSystem解压缩

  • 建立一个文件系统,包含zip文件中的所有项。

  • 遍历zip文件中的所有项,通过文件访问器SimpleFileVisitor将每个项复制到指定目录中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
@Test
public void testDecompressByZip2(){
    try {
        //将压缩文件作为一个文件系统访问
        FileSystem fileSystem = FileSystems.newFileSystem(Paths.get("F:\\myFavorites.zip"), null);
        //遍历压缩文件中的内容,并使用文件访问器访问所有内容
        Files.walkFileTree(fileSystem.getPath("/"), new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                System.out.println("访问目录中文件时调用");
                //将文件解压到指定目录
                Files.copy(file, new FileOutputStream("F:\\我的解压目录\\" + file.getName(file.getNameCount() - 1)));
                return FileVisitResult.CONTINUE;
            }
 
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                System.out.println("访问目录中文件之前调用");
                return FileVisitResult.CONTINUE;
            }
 
            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
                System.out.println("访问目录中文件失败时调用");
                return FileVisitResult.SKIP_SUBTREE;
            }
 
            @Override
            public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
                System.out.println("访问目录中的文件及其所有后代之后调用");
                return FileVisitResult.CONTINUE;
            }
        });
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

转载请注明出处:admin,如有疑问,请联系(47379717)。
本文地址:http://ohoyoo.com/view/540.html

标签:

添加回复:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。