jar文件的复制和解压(JarInputStream,JarOutputStream和JarFile)
2013-07-24 14:15
393 查看
package test; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.JarInputStream; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; import java.util.zip.ZipEntry; import org.apache.log4j.Logger; import org.junit.Test; public class Util_Jar_Test { Logger log = Logger.getLogger(this.getClass()); //复制jar public static void copyJar(File src , File des) throws FileNotFoundException, IOException{ JarInputStream jarIn = new JarInputStream(new BufferedInputStream(new FileInputStream(src))); Manifest manifest = jarIn.getManifest(); JarOutputStream jarOut = null; if(manifest == null){ jarOut = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(des))); }else{ jarOut = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(des)),manifest); } byte[] bytes = new byte[1024]; while(true){ //重点 ZipEntry entry = jarIn.getNextJarEntry(); if(entry == null)break; jarOut.putNextEntry(entry); int len = jarIn.read(bytes, 0, bytes.length); while(len != -1){ jarOut.write(bytes, 0, len); len = jarIn.read(bytes, 0, bytes.length); } // log.info("Copyed: " + entry.getName()); // jarIn.closeEntry(); // jarOut.closeEntry(); String a = new String(); a.length(); } jarIn.close(); jarOut.finish(); jarOut.close(); } //解压jar public void unJar(File src , File desDir) throws FileNotFoundException, IOException{ JarInputStream jarIn = new JarInputStream(new BufferedInputStream(new FileInputStream(src))); if(!desDir.exists())desDir.mkdirs(); byte[] bytes = new byte[1024]; while(true){ ZipEntry entry = jarIn.getNextJarEntry(); if(entry == null)break; File desTemp = new File(desDir.getAbsoluteFile() + File.separator + entry.getName()); if(entry.isDirectory()){ //jar条目是空目录 if(!desTemp.exists())desTemp.mkdirs(); log.info("MakeDir: " + entry.getName()); }else{ //jar条目是文件 BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(desTemp)); int len = jarIn.read(bytes, 0, bytes.length); while(len != -1){ out.write(bytes, 0, len); len = jarIn.read(bytes, 0, bytes.length); } out.flush(); out.close(); log.info("Copyed: " + entry.getName()); } jarIn.closeEntry(); } //解压Manifest文件 Manifest manifest = jarIn.getManifest(); if(manifest != null){ File manifestFile = new File(desDir.getAbsoluteFile()+File.separator+JarFile.MANIFEST_NAME); if(!manifestFile.getParentFile().exists())manifestFile.getParentFile().mkdirs(); BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(manifestFile)); manifest.write(out); out.close(); } //关闭JarInputStream jarIn.close(); } //复制jar by JarFile public void copyJarByJarFile(File src , File des) throws IOException{ //重点 JarFile jarFile = new JarFile(src); Enumeration<JarEntry> jarEntrys = jarFile.entries(); JarOutputStream jarOut = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(des))); byte[] bytes = new byte[1024]; while(jarEntrys.hasMoreElements()){ JarEntry entryTemp = jarEntrys.nextElement(); jarOut.putNextEntry(entryTemp); BufferedInputStream in = new BufferedInputStream(jarFile.getInputStream(entryTemp)); int len = in.read(bytes, 0, bytes.length); while(len != -1){ jarOut.write(bytes, 0, len); len = in.read(bytes, 0, bytes.length); } in.close(); jarOut.closeEntry(); log.info("Copyed: " + entryTemp.getName()); } jarOut.finish(); jarOut.close(); jarFile.close(); } //解压jar文件by JarFile public void unJarByJarFile(File src , File desDir) throws FileNotFoundException, IOException{ JarFile jarFile = new JarFile(src); Enumeration<JarEntry> jarEntrys = jarFile.entries(); if(!desDir.exists())desDir.mkdirs(); //建立用户指定存放的目录 byte[] bytes = new byte[1024]; while(jarEntrys.hasMoreElements()){ ZipEntry entryTemp = jarEntrys.nextElement(); File desTemp = new File(desDir.getAbsoluteFile() + File.separator + entryTemp.getName()); if(entryTemp.isDirectory()){ //jar条目是空目录 if(!desTemp.exists())desTemp.mkdirs(); log.info("makeDir" + entryTemp.getName()); }else{ //jar条目是文件 //因为manifest的Entry是"META-INF/MANIFEST.MF",写出会报"FileNotFoundException" File desTempParent = desTemp.getParentFile(); if(!desTempParent.exists())desTempParent.mkdirs(); BufferedInputStream in = new BufferedInputStream(jarFile.getInputStream(entryTemp)); BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(desTemp)); int len = in.read(bytes, 0, bytes.length); while(len != -1){ out.write(bytes, 0, len); len = in.read(bytes, 0, bytes.length); } in.close(); out.flush(); out.close(); log.info("Copyed: " + entryTemp.getName()); } } jarFile.close(); } /*实验结论: * 1.JarInputStream的getNextJarEntry()和jarOutputStream的putNextJarEntry()中没有包括"META-INF/MANIFEST.MF"这一项,因此复制和解压都 要注意 * 2.JarFile的entries()方法包含了全部Entry,也包括"META-INF/MANIFEST.MF",没有"META-INF/"这一项,因此在解压的时候要先检测父文件存不存在 * 4.复制jar文件有3中方法, A是直接用BufferedInputStream和BufferedOutputStream复制, * B是用JarInputStream的getNextJarEntry()和jarOutputStream的putNextJarEntry() * C是用JarFile的entries()方法,遍寻JarEntry的InputStream,以此写出 * 5.解压jar的话推荐使用JarFile,当前实例方法只支持解压jar文件 * 6.在复制的时候,src文件只可以是jar文件,但des文件可以是带zip或rar后缀的文件 */ public static void testCopyJar(){ File src = new File("C:\\Documents and Settings\\Administrator\\桌面\\ESB新版本\\新建文件夹\\win32.win32.x86\\eclipse\\plugins\\xmlEditor.jar"); File des = new File("C:\\Documents and Settings\\Administrator\\桌面\\ESB新版本\\新建文件夹\\win32.win32.x86\\eclipse\\workspace\\j\\lib/1.jar"); //实验表明只运行复制和解压jar文件 // File src = new File("C:/rtf.zip"); // File des = new File("C:/testCopy.zip"); try { copyJar(src,des); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { testCopyJar(); } public void testUnJar(){ File src = new File("C:/a.jar"); // File src = new File("C:/b.rar"); //不支持rar解压 String desFile = "aa"; File desDir = new File(src.getParent()+File.separator+desFile); try { unJar(src, desDir); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void testCopyJarByJarFile(){ File src = new File("C:/a.jar"); File des = new File("C:/testCopy.zip"); try { copyJarByJarFile(src,des); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void testUnJarByJarFile(){ File src = new File("C:/a.jar"); // File src = new File("C:/b.rar"); //不支持rar解压 String desFile = "aa"; File desDir = new File(src.getParent()+File.separator+desFile); try { unJarByJarFile(src, desDir); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
相关文章推荐
- File根据inputstream复制文件到临时目录,使用完之后删除
- java: file/outputStream/InputStream 复制文件
- Java中用文件通道(FileChannel)、BufferedInputStream/BufferedOutputStream复制文件对比
- Java——FileInputStream&FileOutputStream字节流实现文件复制
- FIle 文件操作,包括文件的复制、删除以及zip和rar格式的解压操作
- java FileInputStream读文件
- winform 运用ZipFile解压文件
- [Java语言] java 中使用ZipInputStream或ZipFile解压ZIP文件!!
- 复制粘贴党的福音——PasteAsFile,粘贴为文件
- MyEclipse 安装(或解压)后运行报“An error has occurred. See the log file”;在日志文件报错:java.lang.RuntimeException
- Eclipse插件jar文件复制到plugins文件夹下,不能自动安装
- FileStream.Read的使用 以及FileStream, FileCopy 文件的复制
- Jar文件的处理_解压
- C# FileStream 文件复制
- 官网下载的Struts 2解压后缺少xwork-core.jar文件
- Java文件读写数据流大全(InputStream、OutputStream、FileInpuStream)
- File类复制文件
- FileInputStream.FileOutputStream执行图片复制
- 文件上传 解压 复制
- jar文件使用代码解压出现异常