压缩文件
1、对于压缩文件进行依字节读取
public class io01 {
public static void main(String[] args) throws IOException {
FileInputStream file= new FileInputStream("C:\\Users\\Administrator\\Desktop\\66\\easyftp-server-1.7.0.10-cn.zip");
byte[] buff=new byte[128];
int length=0;
while ((length=file.read(buff))!=-1){
System.out.printf("本次读取到%d个字节%s\n",length, Arrays.toString(buff));
}
}
}
用字节输入流读取文件中的数据,buff存储读入的数据,当读取完成后file.read会返回-1,所以进行判断是否完成读取。
2、对于zip格式文件的处理
File in =new File(path);
String filename=in.getName();
File rootDir=new File(in.getParent()+"\\"+filename.substring(0,filename.lastIndexOf(".")));
初始出变量in(即为需要解压的文件),获取文件名,并创建一个新的同名文件夹用于存放解压后的文件。
if (rootDir.exists()){
try {
FileUtils.deleteDirectory(rootDir);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
rootDir.mkdir();
判断所创文件夹是否已经存在,若存在则删除,若不存在则创建一个,其中需要运用到第三方工具包,用于删除非空文件。
ZipInputStream zip = new ZipInputStream(new FileInputStream(in));
ZipEntry entry = null;
while ((entry = zip.getNextEntry()) != null){
System.out.println(entry.getName());
ZipInputStream是Zip格式文件的输入流,将in(即为需要解压的文件)的文件引入,创建ZipEntry类型变量entry,作用为表达压缩文件条目,进行判空,若不为空则继续读取下一条目的文件名。
File dir = new File(rootDir.getAbsolutePath()+"\\"+entry.getName());
if (entry.isDirectory()){
dir.mkdir();
}else {
dir.createNewFile();
创建File类型变量dir表示读取到的文件目录,判断是否为文件夹,分别创建文件夹或文件。
FileOutputStream fos = new FileOutputStream(dir);
byte[] buffer = new byte[1024];
int length=-1;
while ((length = zip.read(buffer)) != -1){
fos.write(buffer, 0, length);
用输出流对于文件解压缩后进行数据读出,创建一个byte表用上文的方式存储在byte表中,循环读出用write方法写出解压缩文件,完成对于zip文件的处理。
3、对于rar格式文件的处理
Archive archive = new Archive(new FileInputStream(path));
List<FileHeader> fileHeaders = archive.getFileHeaders();
fileHeaders.sort(new Comparator<FileHeader>() {
@Override
public int compare(FileHeader o1, FileHeader o2) {
return o1.getFileName().compareTo(o2.getFileName());
由于直接进行解压缩会导致深度较高的文件解压时找不到上一级目录,所以需要对文件进行预处理,简单进行排序,根据文件名长短排序可以避免找不到父目录的情况,在comparator容器中重写compare方法,返回重新排序后的待解压文件。
for (FileHeader fileHeader : fileHeaders) {
System.out.println(fileHeader.getFileName());
File f = new File(rootDir.getPath() + "\\" + fileHeader.getFileName());
if (fileHeader.isDirectory()) {
f.mkdir();
} else {
f.createNewFile();
}
InputStream in = archive.getInputStream(fileHeader);
FileUtils.copyInputStreamToFile(in,f);
同样对子目录文件进行判断,分别创建文件夹或者文件。采用第三方包的copyInPutStream方法,将储存在in中的文件复制读入到创建的新文件夹中。
查重
4、对于两个文件的查重处理
String path = "C:\\Users\\Administrator\\Desktop\\66\\easyftp-server-1.7.0.10-cn.zip";
String path1 = "C:\\Users\\Administrator\\Desktop\\66\\easyftp-server-1.7.0.10-cn\\Readme-说明.htm";
byte[] byte1 = Files.readAllBytes(Paths.get(path));
byte[] byte2 = Files.readAllBytes(Paths.get(path1));
String hash1=hash(byte1);
String hash2=hash(byte2);
首先获取两个文件的位置,将其数据分别存在两个byte表中,采用哈希算法的思想,分别计算哈希值,对比得出是个否重复。
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(bytes);
byte[] digest = md.digest();
StringBuilder sb=new StringBuilder();
for (byte b : digest) {
sb.append(String.format("%02x", b));
定义一个字符序列来储存计算出的哈希值,格式化为16进制数值,返回得出的数值。
解压
5、对于文件的压缩处理
File dir = new File("C:\\Users\\Administrator\\Desktop\\666\\软件2101软件工程实训作业");
File[] files = dir.listFiles();
获取待压缩文件及位置,将其转化为一个数组。
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();
用Zip的输出流进行解压缩,提取文件名创建同名压缩文件,调用putNextEntry方法将压缩好的空文件生成新的同名条目,调用write方法分别写入,完成压缩。