Bootstrap

如何处理压缩文件?

一、将压缩包解压缩

1.解压缩.zip包

实现步骤:

(1).根据原始路径(字符串),创建源文件(File对象)

(2).创建根目录(File对象),判断根目录是否已经存在,如果存在,则删除(//rootDir.delete();仅能删除空目录,非空白目录则需使用commons-io包提供的FileUtils工具类进行删除),如果不存在,则在磁盘上创建根目录

(3).ZipInputStream:用于进行zip格式的压缩文件输入流;遍历压缩包中的每个子目录或子文件(ZipEntry类型的对象)

(4).创建子目录或子文件(File对象),如果ZipEntry类型的对象是目录,则在物理磁盘创建子目录,反之,在物理磁盘创建子文件

(5). 最后,读取当前压缩包中的子文件,并通过输出流out写入新子文件中

2.解压缩.rar包

实现步骤:

(1).创建解压缩的根目录

(2).创建Archive对象,用于读取rar压缩文件格式;获取压缩文件中的所有子目录或子文件(FileHeader对象)

(3).按照子目录(子文件)名称排序,遍历子目录和子文件

(4).创建新子目录和新子文件

(5).获取压缩包中的子文件输入流,最后,复制文件输入流至新子文件

综上1,2实现代码:
public class test01 {
	public static void main(String[] args) {
      //String path="D:\\Downloads\\easyftp-server-1.7.0.10-cn.zip";
		String path="D:\\Downloads\\实验案例.rar";
		if(path.endsWith(".zip")) {
			unzip(path);
		}else if(path.endsWith(".rar")) {
			unrar(path);
		}
	}

	//解压缩zip格式
	public static void unzip(String path) {
		File sourceFile=new File(path);
		String sourceFileName=sourceFile.getName();
		File rootDir=new File(sourceFile.getParent()+"\\"+sourceFileName.substring(0,sourceFileName.lastIndexOf(".")));
		if(rootDir.exists()) {
			try {
				FileUtils.deleteDirectory(rootDir);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		rootDir.mkdir();
		try (ZipInputStream in = new ZipInputStream(new FileInputStream(sourceFile))) {
			ZipEntry zipEntry=null;
			while((zipEntry=in.getNextEntry())!=null) {
				//System.out.println(zipEntry.getName());
				File file=new File(rootDir.getPath()+"//"+zipEntry.getName());
				if(zipEntry.isDirectory()) {
					file.mkdir();
				}else {
					file.createNewFile();
					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 (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	//解压缩rar格式
	public static void unrar(String path) {
		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();
		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) {
				//System.out.println(fd.getFileName());
				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 | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

二、创建zip压缩文件

实现步骤:

(1).根据文件所在目录,获取所有原始子文件

(2).创建zip压缩文件的输出流

(3).遍历所有原始子文件

(4).写入一个压缩包中的子文件(ZipEntry对象)

(5).写入字节内容

(6).最后,关闭压缩包中的子文件

实现代码:
public class test02 {
	public static void main(String[] args) {
		//文件所在目录
		File dir=new File("D:\\JSP\\jsp作业");
		File[] files=dir.listFiles();
		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 e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

;