Zip文件的解析与生成

在我们需要对Zip文件作出一些相应的操作时,我们就需要使用ZipInputStream类来解析以及生成Zip文件,ZIpInputStream是FilterInputStream的子类,所以可以知道他也是一个装饰器,并没有真正读取文件的能力,以下是Zip文件解析与生成的具体方法步骤:

(一)解析Zip文件

首先,我们要获取一个ZIp文件,在创建一个解压缩文件夹来存放解压出来的Zip文件内容

        // 要进行解压缩的zip文件
		File zipFile = new File("c:\\Text\\1-201023201325.zip");

		// 1.创建解压缩目录
		// 获取zip文件的名称
		String zipFileName = zipFile.getName();

		// 根据zip文件名称,提取压缩目录的名称
		String targetDirName = zipFileName.substring(0, zipFileName.indexOf("."));

		// 创建解压缩目录
		File targetDir = new File(zipFile.getParent() + "\\" + targetDirName);
		if (!targetDir.exists()) {
			targetDir.mkdir();// 创建目录
		}

然后,使用ZipInputStream类对文件进行解析,在里面传入一个FileInputStream来读取到Zip文件,为了能匹配文件里可能会有中文,我们调用重载过的构造方法ZipInputStream(InputStream in, Charset charset),传入一个字符集,来识别中文字符。最后在方法中循环调用getNextEntry()方法,直到返回null,表示Zip流结束,一个ZIpEntry表示一个压缩文件或目录,如果是压缩文件,我们就用read()方法不断读取,一直到返回-1,则表示读取完毕。

// 2.解析读取zip文件
		try (ZipInputStream in = new ZipInputStream(new FileInputStream(zipFile), Charset.forName("gbk"))) {
			
			//遍历zip文件中的每个子文件
			ZipEntry zipEntry = null;
			while ((zipEntry = in.getNextEntry()) != null) {
				// 获取zip压缩包内的子文件名称
				String zipEntryFileName = zipEntry.getName();

				// 创建该文件的输出流
				String zipFilePath = targetDir.getPath() + "\\" + zipEntryFileName;
				try(BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(zipFilePath))){
					// 读取该子文件的字节内容
					byte[] buff = new byte[1024];
					int len = -1;
					while ((len = in.read()) != -1) {
						bos.write(buff, 0, len);
					}
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

(二)生成ZIp文件

要生成一个Zip文件,首先必须先创建一个与原始文件名相同,后缀名为.zip的文件,然后创建一个文件数组,来获取遍历原始目录下的所有子文件列表,同样的,我们需要使用ZipOutputStram来进行对压缩文件的写入,他同样也需要传入一个FileOutputStram来写入文件,每写入一个文件前,要先调用putNextEntry()方法,再用write()方法写入byte[]数据,全部写入后再使用closeEntry()结束文件的打包。

        // 原始目录
		File rootDir = new File("c:\\Text\\ccc");

		// 将原始目录中的文件,“写入”zip压缩文件
		try (ZipOutputStream out = new ZipOutputStream(
				new FileOutputStream(rootDir.getParent() + "\\" + rootDir.getName() + ".zip"))) {

			// 获取并遍历原始目录下的子文件列表
			File[] files = rootDir.listFiles();
			for (File f : files) {
 
				// 创建一个zipEntry
				out.putNextEntry(new ZipEntry(f.getName()));

				// 将原文件中的字节内容,写入zip压缩包
				out.write(Files.readAllBytes(f.toPath()));

				// 结束当前zipEntry
				out.closeEntry();
			}

		} catch (IOException e) {
			e.printStackTrace();
		}

你可能感兴趣的:(eclipse,java)