一、将zip和rar文件解压缩
解压缩zip格式步骤:
1.根据原始路径,创建源文件(File对象)
2.创建根目录对象,传入源文件的根目录(父级对象\\源文件名)
3.判断根目录是否存在(用exists()方法)
若存在,则删除:
rootDir.delete():仅能删除空目录;
common-io包提供的FileUtils工具中的deleteDirectory()方法进行非空白目录删除。
若不存在,则创建根目录:
rootDir.mkdir():即产生一个与压缩文件同名的空文件夹。
4.用ZipInputStream对象进行zip格式的压缩文件输入流
1>创建一个ZipInputStream的对象,将FileInputStream类型的对象作为数据源;
2>压缩包中的每个子目录或子文件都是ZipEntry类型的对象,遍历一遍;
通过ZipInputStream对象调用getNextEntry()方法获取文件流:
创建子目录或子文件;
如果ZipEntry类型的对象是目录,则创建子目录:file.mkdir();
如果ZipEntry类型的对象是文件,则创建子文件:file.createNewFile();
读取当前压缩包中的子文件,并通过输出流out写入子文件中(每次读取1024个字节)。
解压缩rar格式步骤:
1.根据原始路径,创建源文件(File对象)
2.创建根目录对象,传入源文件的根目录(父级对象\\源文件名)
3.判断根目录是否存在(用exists()方法)
若存在,则删除;
若不存在,则创建根目录。
4.用Archive对象进行rar格式的压缩文件输入流
1>创建一个Archive的对象,将FileInputStream类型的对象作为数据源;
2>获取压缩文件中的所有子目录或子文件(FileHeader对象)(List集合)
3>按照子目录(子文件)排序
4>遍历子目录和子文件(遍历List集合)
创建子目录或子文件;
如果FileHeader类型的对象是目录,则创建子目录:file.mkdir();
如果FileHeader类型的对象是文件,则创建子文件:file.createNewFile()、获取压缩包中的子文件输入流(getInputStream()方法)、复制文件输入流至新子文件(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 Test{
public static void main(String[] args) {
String path="D:\\QQ文件\\文件\\easyftp-server-1.7.0.10-cn.zip";
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()) {
//使用common-io包提供的FileUtils工具类进行删除
try {
FileUtils.deleteDirectory(rootDir);
} 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) {
//创建子目录或子文件(File对象)
File file=new File(rootDir.getPath()+"\\"+zipEntry.getName());
if(zipEntry.isDirectory()) {
//物理磁盘创建子目录
file.mkdir();
}else {
//物理磁盘创建子文件
file.createNewFile();
//读取当前压缩包中的子文件,并通过输出流out写入子文件中
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) {
e.printStackTrace();
}
}
//解压缩rar格式
private 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) {
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();
}
}
}
二、将文件压缩为zip文件
1.创建File对象,引用源文件路径;
2.调用listFiles方法,获取原始所有子文件,保存在File数组中;
3.创建Zip压缩文件的输出流
创建一个ZipOutputStream的对象,将FileOutputStream类型的对象作为数据源;
遍历所有的原始子文件:
每循环一次创建一个ZipEntry类型的对象,写入一个压缩包的子文件(调用putNextEntry方法);
写入所有的字节内容;
注:使用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 Test{
public static void main(String[] args) {
//所在目录
File dir=new File("D:\\TEXT\\copy");
//获取原始所有子文件
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();
}
}
}