zoukankan      html  css  js  c++  java
  • Java对Jar文件的操作[转]

      原文地址:http://www.cnblogs.com/mailingfeng/archive/2012/04/24/2122160.html

       String dirPath = System.getProperty("user.dir") + "\conf";

       File dirFile = new File(dirPath);

      

      获取jar包中文件的方法,是不能使用上面的方法的。需要通过遍历jar包中的文件来获得,此处如果不以“/” 开头,会被当作相对于当前类所在的包类处理,自然无法找到。Jar包内的文件是无法用File读取的,只能用Stream的方式读取。

      获取jar包中的内容需要通过遍历JarFile下的JarEntry,通过File.list()是不能获得jar包下面的文件的

      

      例子程序:

      包含了使用JarOutputStream和JarFile来进行 jar包的复制、解压操作,实际使用中使用JarOutputStream或JarFile的一种即可。

    package jdk.util;
    
    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 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后缀的文件
         */
        
        @Test
        public void testCopyJar(){
            File src = new File("C:/a.jar");
            File des = new File("C:/testCopy.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();
            }
        }
        
        @Test
        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();
            }
        }
        
        
        @Test
        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();
            }
        }
        
        @Test
        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();
            }
        }
     }
  • 相关阅读:
    js里的稀疏数组
    JS中二进制与十进制的相互转换
    【leetcode-03】给定一个字符串,请你找出其中不含有重复字符的最长子串的长度
    JavaScipt30(第二十二个案例)(主要知识点:getBoundingClientRect)
    JavaScipt30(第十八个案例)(主要知识点:Array.prototype.map)
    JavaScipt30(第十个案例)(主要知识点:选中一个数组中间相连部分进行操作的一种思路)
    JavaScipt30(第八个案例)(主要知识点:canvas)
    Lydsy2017省队十连测
    几个多项式的题
    poj3294Life Forms
  • 原文地址:https://www.cnblogs.com/lnlvinso/p/4587308.html
Copyright © 2011-2022 走看看