zoukankan      html  css  js  c++  java
  • Java中zip的压缩和解压缩

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

    zip压缩

    待压缩文件目录结构:

    每个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();
    	}
    }
    

    压缩结果:

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

    解压缩结果:

    使用FileSystem解压缩

    1. 建立一个文件系统,包含zip文件中的所有项。
    2. 遍历zip文件中的所有项,通过文件访问器SimpleFileVisitor将每个项复制到指定目录中。
    @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();
    	}
    }
    
  • 相关阅读:
    SVO深度解析(三)之深度滤波(建图部分)
    SVO深度解析(二)之跟踪部分
    SVO深度解析(一)之简介和评价
    图像三维重建方法综述
    SLAM优化位姿时,误差函数的雅可比矩阵的推导。
    Canny边缘检测原理与C++实现(2)实现部分
    Canny边缘检测原理与C++实现(1)原理部分
    指针的大小是谁决定的
    Ubuntu 16.04配置CUDA 9.0+cudnn 7.0以及解决Nvidia显卡导致黑屏问题
    安装FAB-Map 2.0,Ubtuntu 16.04
  • 原文地址:https://www.cnblogs.com/seve/p/14432735.html
Copyright © 2011-2022 走看看