java 7zip解压_Java中zip的压缩和解压缩

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

zip压缩

待压缩文件目录结构:

65c982a7f74c2d3c916654fc5962bc31.png

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

@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();

}

}

压缩结果:

65c037e8b47b899d9e2ff0ac08fc98b8.png

zip解压缩

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

@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();

}

}

解压缩结果:

be04e5e49f63e0c9d0fb0dcbff093e32.png

使用FileSystem解压缩

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

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

public void testDecompressByZip2(){

try {

//将压缩文件作为一个文件系统访问

FileSystem fileSystem = FileSystems.newFileSystem(Paths.get("F:\myFavorites.zip"), null);

//遍历压缩文件中的内容,并使用文件访问器访问所有内容

Files.walkFileTree(fileSystem.getPath("/"), new SimpleFileVisitor() {

@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();

}

}

内容来源于网络如有侵权请私信删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值