压缩文件的解决方法

解压文件

想要处理压缩文件,回顾IO流的知识是必要的

I:Input输入,通过“输入流”进行文件的读取操作

O:Output输出,通过“输出流”进行文件的写入操作

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;

public class test01 {
	public static void main(String[] args) {
		//创建输入流
		try {
			FileInputStream in = new FileInputStream("C:\\Users\\陈博远\\Desktop\\Apesource_Files\\IO_Files\\test01.zip");
			
//			//每次读取一个字节
//			int data = -1;
//			while((data = in.read()) data = in.read()!= -1) {
//				System.out.println(data);
//			}
			
			//每次读取128个字节
			byte[] buff = new byte[128];
			int len = 0;
			while((len = in.read(buff)) != -1) {
				System.out.printf("本次读取到%d个字节:%s\n",len,Arrays.toString(buff));
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

1.1解压zip文件与rar文件

//导包
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Comparator;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import org.apache.commons.io.FileUtils;

import com.github.junrar.Archive;
import com.github.junrar.exception.RarException;
import com.github.junrar.rarfile.FileHeader;

主函数进行判断,需要解压的文件为zip文件还是rar文件

public static void main(String[] args) {
//	String  path="D:\\test01.zip";
	String path = "D:\\test02.rar";

	if (path.endsWith(".zip")) {
		unzip(path);
	} else if (path.endsWith(".rar")) {
		unrar(path);
	}
}

如果为zip文件,则调用unzip()方法

// 解压缩zip格式
	public static void unzip(String path) {
		// 根据原始路径(字符串),创建源文件(File对象)
		File sourceFile = new File(path);

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

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

			// 使用commons-io包提供的FileUtils工具类进行删除
			try {
				FileUtils.deleteDirectory(rootDir);
				System.out.println("已删除");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

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

		// ZipInputStream:用于进行zip格式的压缩文件输入流
		try (ZipInputStream in = new ZipInputStream(new FileInputStream(sourceFile))) {
			// 遍历压缩包中的每个子目录或子文件(ZipEntry类型的对象)
			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();

					// 读取当前压缩包中的子文件,并通过输出流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 (Exception e) {
						e.printStackTrace();
					}
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

如果为rar文件,则调用unrar()方法

// 解压缩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) {
				e.printStackTrace();
			}
		}
		rootDir.mkdir();

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

			// 获取压缩文件中的所有子目录或子文件(FileHeader对象)
			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 | IOException e) {
			e.printStackTrace();
		}
	}

文件查重

//导包
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

主函数提前找到两个相同但不同名的文件并且读取两个路径对应文件的所有字节数据

public static void main(String[] args) {
		String path1="C:\\画布(1).pdf";
		String path2="C:\\画布(2).pdf";
		
		//读取路径1与路径2对应文件的所有字节数据
		try {
			byte[] bytes1 = Files.readAllBytes(Paths.get(path1));
			byte[] bytes2 = Files.readAllBytes(Paths.get(path2));
			
			String hash1=hash(bytes1);
			String hash2=hash(bytes2);
			
			System.out.println(hash1);
			System.out.println(hash2);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

 计算对应的哈希值进行比对,如若相同则重复,可应用于作业抄袭的查重

public static String hash(byte[] bytes) {
		try {
			MessageDigest md = MessageDigest.getInstance("SHA-512");
			
			//传入(更新)原始信息
			md.update(bytes);
			
			//计算哈希值(字节类型)
			byte[] hashBytes=md.digest();
			
			//转换成16进制字符串
			StringBuilder ret= new StringBuilder();
			for (byte b : hashBytes) {
				ret.append(String.format("%02x", b));
			}
			return ret.toString();
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return "error";
		}
		
	}

文件查重并显示相同文件

//导包
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;

主函数使用File工具类的walkFileTree方法进行文件夹遍历并覆写其中的visitor,根据需求改写遍历方式同时计算所遍历到的文件的哈希值且

public class FangWen {
	public static void main(String[] args) {
		try {
			Files.walkFileTree(Paths.get("D:\\实验案例"),
					new MyFileVisitor());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

class MyFileVisitor extends SimpleFileVisitor<Path> {

	private HashSet<String> set = new HashSet<String>();
	private HashMap<String, Path>  map= new HashMap<String,Path>();
		
	
	// 访问文件
	@Override
	public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
		// 读取当前文件的所有字节值
		byte[] bytes = Files.readAllBytes(file);

		// 计算当前文件的哈希值
		String hash = ChaChong.hash(bytes);

		Path oldFile = map.put(hash,file);
		if (oldFile != null) {
			System.out.println(file);
			System.out.println(hash);
			System.out.println();
		}
		
		

		return FileVisitResult.CONTINUE;
	}
}

压缩文件

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

先使用File创建数组将所有原始子文件保存在数组后进行遍历并写入压缩文件

public class YaSuo {
	public static void main(String[] args) {
		//所在目录
		File dir=new File("C:\\Users\\陈博远\\Desktop\\Apesource_Files\\IO_Files\\music");
		
		//获取所有原始子文件
		File[] files =dir.listFiles();
		
		//创建zip压缩文件的输出流
		try(ZipOutputStream out = new ZipOutputStream(new FileOutputStream(dir.getParent()+"\\"+dir.getName()+".zip"));) {
			
			//遍历所有原始子文件
			for (File f : files) {
				//写入一个压缩包中的子文件(ZipEntry对象)
				out.putNextEntry(new ZipEntry(f.getName()));
				
				//写入字节内容
				out.write(Files.readAllBytes(f.toPath()));
				
				//关闭压缩包中的子文件
				out.closeEntry();
			}
		
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
	}
}

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓晨CH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值