import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.Charset; import java.util.Enumeration; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipInputStream; import com.github.junrar.Archive; import com.github.junrar.rarfile.FileHeader; /** * * @ClassName: FileCompress * @Description: TODO(这里用一句话描述这个类的作用) * @author 周玉波 * @date 2017年4月11日 上午9:30:11 * */ @SuppressWarnings("rawtypes") public final class FileCompress{ /** * zip解压缩 * * @param zipfile * File 需要解压缩的文件 * @param descDir * String 解压后的目标目录 */ public static String unZipFiles(java.io.File zipfile, String descDir) { InputStream in =null; OutputStream out =null; ZipFile zf=null; File file=null; String zipEntryName=""; try { descDir=descDir.replaceAll("\\/", "\\\\").replaceAll("\\.zip", ""); //jdk1.8没有参数Charset,适用于1.7 zf = new ZipFile(zipfile,Charset.forName("GBK")); for (Enumeration entries = zf.entries(); entries .hasMoreElements();) { ZipEntry entry = ((ZipEntry) entries.nextElement()); zipEntryName = entry.getName(); boolean ismkdir = false; if(zipEntryName.lastIndexOf("/") != -1){ //检查此文件是否带有文件夹 ismkdir = true; } zipEntryName = descDir+"\\" + zipEntryName; if(entry.isDirectory()){ //如果是文件夹先创建 file = new File(zipEntryName); file.mkdirs(); continue; } file = new File(zipEntryName); if(!file.exists()){ //如果是目录先创建 if(ismkdir){ new File(zipEntryName.substring(0, zipEntryName.lastIndexOf("/"))).mkdirs(); //目录先创建 } } //file.createNewFile(); //创建文件 in = zf.getInputStream(entry); File dstDiretory = new File(descDir); if (!dstDiretory.exists()) {// 目标目录不存在时,创建该文件夹 dstDiretory.mkdirs(); } out = new FileOutputStream(zipEntryName); byte[] buf1 = new byte[1024]; int len; while ((len = in.read(buf1)) > 0) { out.write(buf1, 0, len); } System.out.println("解压缩完成."); } return zipEntryName.replaceAll("/", "\\\\"); } catch (IOException e) { e.printStackTrace(); }finally{ try { if(out!=null){ out.close(); out=null; } if(in!=null){ in.close(); in=null; } if(zf!=null){ zf.close(); zf=null; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.gc(); } return null; } /** * 根据原始rar路径,解压到指定文件夹下. * @param srcRarPath 原始rar路径 * @param dstDirectoryPath 解压到的文件夹 */ public static String unRarFile(String srcRarPath, String dstDirectoryPath) { dstDirectoryPath=dstDirectoryPath.replaceAll("\\/", "\\\\").replaceAll("\\.rar", ""); //dstDirectoryPath=dstDirectoryPath.substring(0,dstDirectoryPath.lastIndexOf("\\")); if (!srcRarPath.toLowerCase().endsWith(".rar")) { System.out.println("非rar文件!"); return ""; } File dstDiretory = new File(dstDirectoryPath); if (!dstDiretory.exists()) {// 目标目录不存在时,创建该文件夹 dstDiretory.mkdirs(); } Archive a = null; FileOutputStream os=null; try { a = new Archive(new File(srcRarPath)); if (a != null) { a.getMainHeader().print(); // 打印文件信息. FileHeader fh = a.nextFileHeader(); while (fh != null) { if (fh.isDirectory()) { // 文件夹 File fol = new File(dstDirectoryPath + File.separator + fh.getFileNameString()); fol.mkdirs(); } else { // 文件 File out = new File(dstDirectoryPath + File.separator + fh.getFileNameString().trim()); //System.out.println(out.getAbsolutePath()); try {// 之所以这么写try,是因为万一这里面有了异常,不影响继续解压. if (!out.exists()) { if (!out.getParentFile().exists()) {// 相对路径可能多级,可能需要创建父目录. out.getParentFile().mkdirs(); } out.createNewFile(); } os = new FileOutputStream(out); a.extractFile(fh, os); } catch (Exception ex) { ex.printStackTrace(); }finally{ if(os!=null){ os.close(); os=null; } } } fh = a.nextFileHeader(); } } return dstDirectoryPath; } catch (Exception e) { e.printStackTrace(); }finally{ if(a!=null){ try { a.close(); a=null; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return ""; } }RAR的解压需要导入包junrar-0.7.jar
java 解压zip、rar文件
猜你喜欢
转载自blog.csdn.net/zyb112211/article/details/69397594
今日推荐
周排行