利用java进行zip文件解压缩
本文利用Java的zip包中的ZipFile和ZipEntry两个类,获取到压缩包中的所有文件,并将压缩文件通过InputStream写入一个byte数组,再将该byte数组赋值给FileOutputStream中实现压缩文件的解压操作。最后再返回一个包括所有文件绝对路径名的ArrayList
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
public class FileUtil {
public static void main(String[] args) {
System.out.println("start to compress");
ArrayList<String> list=GetFile("H:\\remote\\somegit.zip","H:\\remote\\");
}
public static ArrayList<String> GetFile(String srcFile,String desDirectory) {
ArrayList<String> directories=new ArrayList<>();
File zippedFile=new File(srcFile);
try {
if(!zippedFile.exists())
throw new FileNotFoundException();
if(!srcFile.endsWith("zip")) {
throw new Exception("文件格式不对");
}
ZipFile zf=new ZipFile(srcFile);
//ZipInputStream zis=new ZipInputStream(new FileInputStream(zippedFile));
Enumeration<? extends ZipEntry> zipe=zf.entries();
String directory="";
String file_name="";
while(zipe.hasMoreElements()) {
ZipEntry ze=zipe.nextElement();
if(directory.endsWith("\\"))
directory=desDirectory+ze.getName();
else {
directory =desDirectory+"\\"+ze.getName();
}
File f_d=new File(directory);
if(ze.isDirectory()) {
if(!f_d.exists())
f_d.mkdirs();
}
else {
if(!f_d.exists())
f_d.createNewFile();
try(InputStream fis=zf.getInputStream(ze);
FileOutputStream fos=new FileOutputStream(f_d);){
byte[] b_p=new byte[1024];
int length=-1;
while((length=fis.read(b_p))>0) {
fos.write(b_p);
}
fos.flush();
directories.add(f_d.getAbsolutePath());
}
catch(Exception e) {
e.printStackTrace();
return null;
}
}
}
String s_file="";
return directories;
}
catch(Exception e) {
e.printStackTrace();
return null;
}
}
}
一、利用压缩文件名创建一个ZipFile对象,利用ZipFile获取一个Enumeration<? extends ZipEntry>
ZipFile zf=new ZipFile(srcFile);
Enumeration<? extends ZipEntry> zipe=zf.entries()
二、对Enumeration中的每一个zipentry进行操作,如果是文件夹则获取文件夹路径,如果是文件则通过输入流写入byte数组,同时将byte数组的内容写入输出流,并将在本地的文件路径添加到ArrayList当中。
while(zipe.hasMoreElements()) {
ZipEntry ze=zipe.nextElement();
if(directory.endsWith("\\"))
directory=desDirectory+ze.getName();
else {
directory =desDirectory+"\\"+ze.getName();
}
File f_d=new File(directory);
if(ze.isDirectory()) {
if(!f_d.exists())
f_d.mkdirs();
}
else {
if(!f_d.exists())
f_d.createNewFile();
try(InputStream fis=zf.getInputStream(ze);
FileOutputStream fos=new FileOutputStream(f_d);){
byte[] b_p=new byte[1024];
int length=-1;
while((length=fis.read(b_p))>0) {
fos.write(b_p);
}
fos.flush();
directories.add(f_d.getAbsolutePath());
}