【Java-压缩文件的解析方式】

 解压

 当我们拿到一个压缩文件,如下

现下常见的两种压缩格式,zip和rar。那么针对格式的不同,他们使用的jar包和方法也有所不同。

解压zip格式文件

一.技术准备

需要使用到第三方jar包

1.Apache软件基金会属于第三方,使用第三方开发出来的工具,都需要添加第三方提供给我们的jar包
    
2.jar包:本身是一个压缩包,里面转的都是class文件,我们想使用jar包中的工具类,就需要将相应的jar包解压到我们的当前项目下
    
3.怎么引入jar包
  a.在当前模块下创建文件夹,取名为lib
  b.将准备好的jar包,放到此文件夹下
  c.对着jar包,右键 -> Build Path -> add as library
  d.level可以选择module,此时上面叫做name的输入框会变成空的,不用管
  e.直接点ok  
 

二、代码实现

public class Test {
	public static void main(String[] args) {
		String path = "D:\\Test\\easyftp-server-1.7.0.10-cn.zip";
		unzip(path);
	
	}

	// zip文件解压缩
	public static void unzip(String path) {
		// 1.1根据原始路径创建源文件
		File sourceFlie = new File(path);

		// 1.2根目录
		String sourceFlieName = sourceFlie.getName();
		File rootDir = new File(
				sourceFlie.getParent() + "\\" + sourceFlieName.substring(0, sourceFlieName.lastIndexOf(".")));

		// 判断根目录是否存在
		if (rootDir.exists()) {
			// 如果存在,则删除
			// l rootDir.delete();//仅能删除空目录

			// 使用commons-io包提供的FileUtils工具类进行删除
			try {
				FileUtils.deleteDirectory(rootDir);

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

		// 1.3创建根目录
		rootDir.mkdir();

		// ZipInputStream:用于进行zip格式的压缩文件输入流
		try (ZipInputStream in = new ZipInputStream(new FileInputStream(sourceFlie));) {
			// 遍历压缩包中每个子目录或子文件(ZipEntry类型的对象)
			ZipEntry zipEntry = null;
			while ((zipEntry = in.getNextEntry()) != null) {
				File file = new File(rootDir.getPath() + "\\" + zipEntry.getName());

				if (zipEntry.isDirectory()) {
					// 物理磁盘创建子目录
					file.mkdir();
				} else {
					// 物理磁盘创建子文件
					file.createNewFile();

					// 读取读取压缩包中的子文件,并通过输出流out写入新的子文件
					try (FileOutputStream out = new FileOutputStream(file);) {
						byte[] buff = new byte[1024];
						int len = -1;
						while ((len = in.read(buff)) != -1) {
							out.write(buff, 0, len);
						}
					}

				}
			}

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}
}

解压rar格式文件

 需要使用到第三方包:slf4j-api-2.0.13.jar、junrar-7.5.5.jar.

jar包的导入方法同上

代码实现

public class Test {
	public static void main(String[] args) {
		String path = "D:\\Test\\实验案例.rar";
		unrar(path);
	
	}

// rar文件解压缩
	public static void unrar(String path) {
		// 1.创建解压缩的根目录
		File rarFile = new File(path);
		File rootDir = new File(
				rarFile.getParent() + "\\" + rarFile.getName().substring(0, rarFile.getName().lastIndexOf(".")));
		if (rootDir.exists()) {
			try {
				FileUtils.deleteDirectory(rootDir);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		rootDir.mkdir();

		// 创建Archive对象,用于读取rar压缩文件格式
		try (Archive archive = new Archive(new FileInputStream(path))) {

			// 获取压缩文件中子目录和子文件
			List<FileHeader> fileheaderlist = archive.getFileHeaders();

			// 按照名称排序
			fileheaderlist.sort(new Comparator<FileHeader>() {

				@Override
				public int compare(FileHeader o1, FileHeader o2) {
					return o1.getFileName().compareTo(o2.getFileName());
				}

			});

			// 遍历子文件子目录
			for (FileHeader fd : fileheaderlist) {
				File f = new File(rootDir.getPath() + "\\" + fd.getFileName());

				if (fd.isDirectory()) {
					// 创建新子目录
					f.mkdir();
				} else {
					// 创建新子文件
					f.createNewFile();
					// 获取压缩包中的子文件输入流
					InputStream in = archive.getInputStream(fd);
					// 复制文件输入流至新子文件
					FileUtils.copyInputStreamToFile(in, f);
				}
			}

		} catch (RarException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

压缩

public class Test {
	public static void main(String[] args) {
		// 所在目录
		File dir = new File("D:\\Test");

		// 获取所有原始子文件
		File[] files = dir.listFiles();

		// 创建zip压缩文件的输出流
		try (ZipOutputStream out = new ZipOutputStream(
				new FileOutputStream(dir.getPath() + "\\" + dir.getName() + ".zip"))) {
			// 遍历所有子文件
			for (File f : files) {
				// 写入一个压缩包中的子文件
				out.putNextEntry(new ZipEntry(f.getName()));
				// 写入字节内容
				out.write(Files.readAllBytes(f.toPath()));
				// 关闭压缩包中子文件
				out.closeEntry();
			}
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值