很多时候我们需要对服务器上存储的一些压缩文件内容进行分析,于是就需要先对文件进行解压,Java也可以实现对zip和rar文件的解压缩。
以下是实现的部分代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
package com.svse.test; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Enumeration; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import de.innosystec.unrar.Archive; import de.innosystec.unrar.rarfile.FileHeader; /** * zip和rar解压缩工具类 * @author lenovo * */ public class ZipAndRarTools { /** * 解压rar * @param sourceRarPath 需要解压的rar文件全路径 * @param destDirPath 需要解压到的文件目录 * @throws Exception */ public static void unrar(String sourceRarPath, String destDirPath) throws Exception { File sourceRar=new File(sourceRarPath); File destDir=new File(destDirPath); Archive archive = null; FileOutputStream fos = null; System.out.println("Starting 开始解压..."); try { archive = new Archive(sourceRar); FileHeader fh = archive.nextFileHeader(); int count = 0; File destFileName = null; while (fh != null) { System.out.println((++count) + ") " + fh.getFileNameString()); String compressFileName = fh.getFileNameString().trim(); destFileName = new File(destDir.getAbsolutePath() + "/" + compressFileName); if (fh.isDirectory()) { if (!destFileName.exists()) { destFileName.mkdirs(); } fh = archive.nextFileHeader(); continue; } if (!destFileName.getParentFile().exists()) { destFileName.getParentFile().mkdirs(); } fos = new FileOutputStream(destFileName); archive.extractFile(fh, fos); fos.close(); fos = null; fh = archive.nextFileHeader(); } archive.close(); archive = null; System.out.println("Finished 解压完成!"); } catch (Exception e) { throw e; } finally { if (fos != null) { try { fos.close(); fos = null; } catch (Exception e) { } } if (archive != null) { try { archive.close(); archive = null; } catch (Exception e) { } } } } /** * 解压Zip文件 * @param zipFileName 需要解压缩的文件位置 * @param descFileName 将文件解压到某个路径 * @throws IOException */ public static void unZip(String zipFileName,String descFileName) throws IOException{ System.out.println("文件解压开始..."); String descFileNames=descFileName; if(!descFileNames.endsWith(File.separator)){ descFileNames=descFileNames+File.separator; } try { ZipFile zipFile=new ZipFile(zipFileName); ZipEntry entry=null; String entryName=null; String descFileDir=null; byte[] buf=new byte[4096]; int readByte=0; @SuppressWarnings("rawtypes") Enumeration enums=zipFile.getEntries(); while(enums.hasMoreElements()){ entry =(ZipEntry) enums.nextElement(); entryName=entry.getName(); descFileDir=descFileNames+entryName; if(entry.isDirectory()){ new File(descFileDir).mkdir(); continue; }else{ new File(descFileDir).getParentFile().mkdir(); } File file=new File(descFileDir); OutputStream os=new FileOutputStream(file); InputStream is=zipFile.getInputStream(entry); while((readByte=is.read(buf))!=-1){ os.write(buf, 0, readByte); } os.close(); is.close(); } zipFile.close(); System.out.println("文件解压成功!"); } catch (Exception e) { System.out.println("文件解压失败!"); e.printStackTrace(); } } public static void main(String[] args) throws Exception { //ZipAndRarTools.unrar(newFile("D:\\存放资料的压缩包\\员工材料.rar"),newFile("D:\\存放资料的非压缩包\\")); ZipAndRarTools.unZip("D:\\rarTest\\jar包和配置文件资源.zip", "D:\\rarTest"); ZipAndRarTools.unrar("D:\\rarTest\\rar压缩包.rar", "D:\\rarTest"); } } |