2021年2月24日星期三

Java中zip的压缩和解压缩

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

zip压缩

待压缩文件目录结构:

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

@Testpublic 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输出到指定目录中。

@Testpublic 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将每个项复制到指定目录中。
@Testpublic 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();	}}








原文转载:http://www.shaoqun.com/a/584594.html

跨境电商:https://www.ikjzd.com/

vincent:https://www.ikjzd.com/w/1642

ishare:https://www.ikjzd.com/w/2308


在Java中可以使用ZipOutputStream和ZipInputStream来实现zip的压缩和解压缩操作,另外使用FileSystem也可以用来实现zip的解压缩,下面将介绍这几种方式,直接上代码。zip压缩待压缩文件目录结构:每个zip文件项都要对应一个ZipEntry,然后通过ZipOutputStream的putNextEntry方法开始写入一个新的zip文件项,将文件数据发送到zip
汇通达:https://www.ikjzd.com/w/1758
心怡科技:https://www.ikjzd.com/w/1327
欧苏丹:https://www.ikjzd.com/w/1756
速卖通3.28大促前夕如何做好站内外引流?:https://www.ikjzd.com/home/19923
欧盟、印度、墨西哥等国家对中国产品发起反倾销调查!:https://www.ikjzd.com/home/95961
贸易摩擦影响逐渐显,全球运输先扬后抑电商包裹逆势上扬:https://www.ikjzd.com/home/110275