解压zip跟rar压缩文件
2017-04-19 10:49
495 查看
这里是对zip及rar文件进行解压
需要注意的是,创建文件时注意linux跟windos的分隔符不太一样
下面 File.separator 是获取当前系统分隔符
解压zip需要引入ant.jar包,如下是maven引入配置
解压rar需要引入commons-logging.jar 与 junrar-0.7.jar 包,
依赖包下载
如下是maven引入配置
下面是解压的代码,供大家参考
需要注意的是,创建文件时注意linux跟windos的分隔符不太一样
下面 File.separator 是获取当前系统分隔符
解压zip需要引入ant.jar包,如下是maven引入配置
<dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</artifactId> <version>1.7.0</version> </dependency>
解压rar需要引入commons-logging.jar 与 junrar-0.7.jar 包,
依赖包下载
如下是maven引入配置
<dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.3</version> </dependency> <dependency> <groupId>com.github.junrar</groupId> <artifactId>junrar</artifactId> <version>0.7</version> </dependency>
下面是解压的代码,供大家参考
import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.util.Enumeration; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import com.unionpay.common.util.StringUtil; import com.github.junrar.Archive; import com.github.junrar.rarfile.FileHeader; /** * @author mszhou */ public class FileOperaction{ /** * 解压文件 * @param fileName 需要解压的压缩文件路径 * @param outputDirectory 需要解压到的目录 * @param dirName 解压后文件夹需要重命名的名称 * @return 返回true表示成功 */ public boolean unFile(String fileName,String outputDirectory,String dirName){ boolean flag =false;//默认失败 try{ String pName=""; if(fileName.toLowerCase().endsWith(".zip")){//zip压缩文件 pName=unZipFile(fileName,outputDirectory); }else if(fileName.toLowerCase().endsWith(".rar")){//rar压缩文件 pName=unRarFile(fileName,outputDirectory); }else{//不支持的压缩文件 return flag; } if(pName!=null&&!"".equals(pName)){ //============修改文件夹名称开始================== File from = new File(outputDirectory+File.separator+pName);//旧文件夹 File to = new File(outputDirectory+File.separator+dirName);//新文件夹 if(to.exists()){//判断是否存在,存在先删除 deleteFile(to);//删除,这里调用下面的删除方法 } if (from.renameTo(to)){//修改成功 flag=true;//设置成功标志 } //============修改文件夹名称结束================== } }catch(Exception e){//异常 } return flag; } /** * 解压zip文件方法 * @param zipFilename 要解压的zip包文件 * @param outputDirectory 解压后存放的目录 * @return 返回解压后目录名称 * @throws Exception */ public String unZipFile(String zipFilename,String outputDirectory) throws Exception { String strName="";//保存解压后的文件夹名称 File outFile = new File(outputDirectory);//创建指定解压后存放的目录对象 if(!outFile.exists()){//判断文件是否存在,不存在则先创建 outFile.mkdirs();//不存在则创建 } ZipFile zipFile = new ZipFile(zipFilename);//创建对象 Enumeration en = zipFile.getEntries(); while (en.hasMoreElements()){//判断是否有下一个 ZipEntry zipEntry = (ZipEntry) en.nextElement(); if(zipEntry.isDirectory()){//表示是文件夹 String dirName = zipEntry.getName();//得到文件夹名称 dirName = dirName.substring(0,dirName.length()-1);//去掉后面的/ (如: jieya/ss/ ,去掉后面的/) File f = new File(outFile.getPath() + File.separator + dirName);//创建文件夹对象 f.mkdirs();//创建文件夹 //判断是否是最上层目录(没有目录分割符表示最上层,如:jieya) if(dirName.indexOf("/")<=0&&dirName.indexOf("\\")<=0){ strName=dirName;//保存解压后的文件夹名称(解压后文件夹目录名称) } }else{//表示是文件 File f = new File(outFile.getPath()+File.separator+zipEntry.getName());//创建文件对象 //========判断文件不存在的话,就创建该文件所在文件夹的目录 ==开始======= if(!f.exists()){// String[] arrFolderName = zipEntry.getName().split("/"); String strRealFolder = ""; for (int i = 0; i < (arrFolderName.length - 1); i++) { strRealFolder += arrFolderName[i] + File.separator; } File tempDir = new File(outFile.getPath()+File.separator+strRealFolder);//创建文件夹目录对象 tempDir.mkdirs();//此处使用.mkdirs()方法,而不能用.mkdir() } //========判断文件不存在的话,就创建该文件所在文件夹的目录 ==结束======= f.createNewFile(); InputStream in = zipFile.getInputStream(zipEntry); FileOutputStream out = new FileOutputStream(f); try { int c; byte[] by = new byte[1024]; while ((c = in.read(by)) != -1) { out.write(by, 0, c); } } catch (IOException e) { throw e; } finally { out.close(); in.close(); } } } return strName; } /** * 解压rar文件的方法 * @param rarFilename 需要解压的rar文件路径 * @param outputDirectory 解压后存放的目录 * @return 返回解压后目录名称 * @throws Exception */ public String unRarFile(String rarFilename,String outputDirectory) throws Exception { String strName="";//保存解压后的文件夹名称 File dstDiretory = new File(outputDirectory);//创建指定解压后存放的目录对象 if(!dstDiretory.exists()){//判断文件是否存在,不存在则先创建 dstDiretory.mkdirs();//创建目录 } Archive a = null; try{ a = new Archive(new File(rarFilename)); if (a != null) { FileHeader fh = a.nextFileHeader(); while (fh != null) { //防止文件名中文乱码问题的处理 String dirName = fh.getFileNameW().isEmpty()?fh.getFileNameString():fh.getFileNameW(); if (fh.isDirectory()) {//表示是文件夹 String tmpUrl=outputDirectory+File.separator+dirName; //该操作是将\分割符转换成当前系统的分割符,这操作是怕在linux系统中不识别\分割符 // windos系统分割符是\ , linux系统分隔符是 / //如路径 C:\demo\tmp\dir 在windos下正常,在linux下就会出错 //在linux下C:\demo\tmp\dir转换后为 C:/demo/tmp/dir if("/".equals(File.separator)){ tmpUrl=tmpUrl.replaceAll("\\\\",File.separator); } File fol = new File(tmpUrl);//创建文件对象 fol.mkdirs();//创建文件夹 //判断是否是最上层目录(没有目录分割符表示最上层,如:jieya) if(dirName.indexOf("/")<=0&&dirName.indexOf("\\")<=0){ strName=dirName;//保存解压后的文件夹名称(解压后文件夹目录名称) } }else{//表示是文件 String tmpUrl=outputDirectory+File.separator+dirName.trim(); //该操作是将\分割符转换成当前系统的分割符,这操作是怕在linux系统中不识别\分割符 // windos系统分割符是\ , linux系统分隔符是 / //如路径 C:\demo\tmp\dir 在windos下正常,在linux下就会出错 //在linux下C:\demo\tmp\dir转换后为 C:/demo/tmp/dir if("/".equals(File.separator)){ tmpUrl=tmpUrl.replaceAll("\\\\",File.separator); } File out = new File(tmpUrl);//创建文件对象 FileOutputStream os=null; 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{ os.close(); } } fh = a.nextFileHeader(); } } }catch(Exception e){ throw e; }finally{ a.close(); } return strName; } /** * 删除文件方法 * @param file 表示要删除的文件对象 */ private void deleteFile(File file){ if(file.exists()){//首先判断文件是否存在 if(file.isFile()){//判断是文件 file.delete();//删除文件 }else if(file.isDirectory()){//否则是目录 File files[] = file.listFiles();//获取该目录下的所有文件及目录 for(int i = 0; i < files.length; i++){//遍历 this.deleteFile(files[i]);//自己调用自己,迭代删除 } } file.delete();//最后删除剩余的空文件夹 } } }
相关文章推荐
- rar命令行解压zip文件提示不是 rar 压缩文件,没有可提取的文件的解决办法
- java.util.zip包无法正常解压rar软件压缩的rar文件
- java解压zip或者rar压缩文件
- java解压zip或rar压缩文件(有源码和jar包以及对中文乱码的处理方法)
- 使用apache的工具类进行zip(rar等压缩文件)的解压
- 【Delphi】从内存读取或解压压缩文件(RAR、ZIP、TAR、GZIP等)(二)
- [置顶] 使用Python3解压gz、tar、tgz、zip、rar五种格式的压缩文件例子
- 使用Python3解压gz、tar、tgz、zip、rar五种格式的压缩文件例子
- c# 动态操作 zip\rar 文件,压缩解压组件使用
- ZLIB quazip (只能对ZIP进行解压,不能对RAR等其它的压缩文件解压)
- Mac上zip,rar,tar文件命令解压和压缩
- 【Delphi】从内存读取或解压压缩文件(RAR、ZIP、TAR、GZIP等)(三)
- java zip和rar压缩文件的解压
- 【Delphi】从内存读取或解压压缩文件(RAR、ZIP、TAR、GZIP等)(一)
- Zip压缩文件 与 解压 (MFC 文件操作 四 )
- C#压缩解压RAR压缩文件
- Linux实现对rar压缩文件的解压
- Linux下创建与解压zip, tar, tar.gz和tar.bz2文件及该文件压缩对比
- java实现zip文件压缩,解压
- C#操作压缩文件(rar,zip,gzip,winform/asp.net)