解Zip压缩文件
使用ZipInputStream解压文件流,先创建一个ZipInputStream对象,传入FileInputStream作为数据源,再利用getNextEntry()方法存入一个个ZipEntry对象中,一个ZipEntry表示一个压缩文件或目录,判断ZipEntry对象如果是目录则创建子目录,如果是文件,则创建子文件,并读取当前压缩包中的子文件,通过输出流out写入新子文件中
注意:创建根目录时要判断创建的源文件下根目录是否已经存在,若存在,使用commons-io包提供的FilesUntils工具类进行删除。
解rar压缩文件
创建Archive对象,用于读取rar压缩文件格式,传入FileInputStream作为数据源,将获取到底压缩文件中的所有子目录或子文件存入List集合中,遍历集合中的子目录和子文件,如果是目录,则创建子目录,如果是文件,则创建子文件,获取压缩包所在的子文件输入流,通过FileUtils类的copyInputStreamToFile()方法复制文件输入流至新子文件
代码如下:
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;
public class demo02 {
public static void main(String[] args) {
String path="C:\\Users\\x'z\\Documents\\Tencent Files\\1035195870\\FileRecv\\实验案例.rar";
if(path.endsWith(".zip")) {
unzip(path);
}else if(path.endsWith(".rar")) {
unrar(path);
}
}
//解压缩zip格式
public static void unzip(String path) {
//跟据原始路径(字符串),创建源文件(File对象)
File sourceFile=new File(path);
String soureFileName=sourceFile.getName();
//根目录
File rootDir=new File(sourceFile.getParent()+"\\"+soureFileName.substring(0, soureFileName.lastIndexOf(".")));
//判断根目录是否已经存在
if(rootDir.exists()) {
//如果存在,删除
//rootDir.delete();仅能删除空目录
try {
//使用commons-io包提供的FilesUntils工具类进行删除
FileUtils.deleteDirectory(rootDir);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//创建目录根
rootDir.mkdir();
//ZipInputStream:用于进行zip格式的压缩文件输入流
try (ZipInputStream in = new ZipInputStream(new FileInputStream(sourceFile))) {
//遍历压缩包中的每个子目录或子文件(ZipEntry类型对象)
ZipEntry zipEntry=null;
while((zipEntry=in.getNextEntry())!=null) {
//创建子目录或子文件(File对象)
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())!=-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(".rar")));
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);
}
// System.out.println(fd.getFileName());
}
} catch (RarException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
压缩文件为Zip格式
使用ZipOutputStream写入文件流,先创建一个ZipOutputStream对象,传入FileInputStream作为数据源,再利用putNextEntry()方法存入一个个ZipEntry对象中,然后用write()方法写入字节内容,最后调用closeEntry()方法关闭压缩包中的子文件。
代码如下:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class demo05 {
public static void main(String[] args) {
//所在目录
File dir=new File("C:\\Users\\x'z\\Pictures\\Saved Pictures");
//获取所有原始文件
File[] files=dir.listFiles();
//创建zip压缩文件的输出流
try (ZipOutputStream out = new ZipOutputStream(
new FileOutputStream(dir.getPath()+"\\"+dir.getName()+".zip"))) {
//遍历所有原始子文件
for(File f:files) {
//写入一个压缩包中的子文件(ZipEntry对象)
out.putNextEntry(new ZipEntry(f.getName()));
//写入字节内容
out.write(Files.readAllBytes(f.toPath()));
//关闭压缩包中的子文件
out.closeEntry();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}