利用java进行zip文件解压缩
利用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()); }