当前位置 : 主页 > 编程语言 > java >

CS-DecompressJar

来源:互联网 收集:自由互联 发布时间:2021-06-28
gistfile1.txt /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */package cn.huawei.com.CompressedSeacher.util;i
gistfile1.txt
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package cn.huawei.com.CompressedSeacher.util;
import java.io.BufferedOutputStream;
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 java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author l00358914
 */
public class DecompressJar {
    private static final DecompressJar instance = new DecompressJar();
    private DecompressJar() {
    }
    public static DecompressJar getInstance() {
        return instance;
    }
//    private static String removeBlankCharForJarFileName(String inputJarFileName){
//        return inputJarFileName.replaceAll("\\s","-");
//    }
    /**
     * 解压缩JAR包
     *
     * @param fileName   文件名
     * @param outputPath 解压输出路径
     * @throws IOException IO异常
     */
    //jad -f -ff -o -r -sjava -dD:\decompileTest\lukeall-0.9.9Lucene-Index-Toolbox D:\decompileTest\lukeall-0.9.9Lucene-Index-Toolbox.jar\**/*.class    
    //jad -f -ff -o -r -safe -stat -sjava -dD:\decompileTest\lukeall-0.9.9Lucene-Index-Toolbox D:\decompileTest\lukeall-0.9.9Lucene-Index-Toolbox.jar\**/*.class
    //jad -f -ff -o -r -safe -stat -sjava -dD:\decompileTest\lukeall-0.9.9Lucene-Index-Toolbox D:\decompileTest\lukeall-0.9.9Lucene-Index-Toolbox.jar\**/*.class
    public static String decompressAndDecompile(JarFile jf, String jarpath, String outputPath)
            throws IOException {
        //创建解压包路径
        if (!outputPath.endsWith(File.separator)) {//判断是否以文件分隔符结尾
            outputPath += File.separator;
        }
        outputPath = outputPath + CommonUtil.getInstance().removeBlankCharForJarFileName(jarpath.substring(jarpath.lastIndexOf(File.separator) + 1)) + File.separator;
        System.out.println("outputPath:" + outputPath);
        //枚举jar文件中的每个元素
        for (Enumeration e = jf.entries(); e.hasMoreElements();) {
            JarEntry je = (JarEntry) e.nextElement(); //jar中元素条目
            String outFileName = outputPath + je.getName(); //解压文件的名称
            File f = new File(outFileName); //创建解压文件对象
//            System.out.println(f.getAbsolutePath()); //打印绝对路径
            // 创建该路径的目录和所有父目录
            createFatherDir(outFileName);
            // 如果是目录,则直接进入下一个循环
            if (f.isDirectory()) {
                continue;
            }
            System.out.println("文件创建成功:" + outFileName);
            InputStream in = null;
            OutputStream out = null;
            try {
                in = jf.getInputStream(je);
                FileOutputStream fos = new FileOutputStream(f);
                out = new BufferedOutputStream(fos);
                byte[] buffer = new byte[2048];
                int nBytes = 0;
                while ((nBytes = in.read(buffer)) > 0) {
                    out.write(buffer, 0, nBytes);
                }
            } catch (IOException ioe) {
                throw ioe;
            } finally {
                try {
                    if (out != null) {
                        out.flush(); //立刻写
                        out.close();
                    }
                } catch (IOException ioe) {
                    throw ioe;
                } finally {
                    if (in != null) {
                        in.close();
                    }
                }
            }
        }
        //这里预先创建src文件夹targetSrc
        File src = new File(outputPath.replaceAll(".jar", ".src"));
        src.mkdir();
        CommonUtil.getInstance().decompileClassFolder(outputPath.replaceAll(".jar", ".src"), outputPath);//反编译class
        return outputPath.replaceAll(".jar", ".src");
    }
    /**
     * 循环创建父目录,正则表达式方式
     *
     * @param outFileName
     */
    private static void createFatherDir(String outFileName) {
        // 匹配分隔符
        Pattern p = Pattern.compile("[/\\" + File.separator + "]");
        Matcher m = p.matcher(outFileName);
        // 每找到一个匹配的分隔符,则创建一个该分隔符以前的目录
        while (m.find()) {
            int index = m.start();
            String subDir = outFileName.substring(0, index);
            File subDirFile = new File(subDir);
            if (!subDirFile.exists()) {
                subDirFile.mkdir();
                System.out.println("目录创建完成:" + subDir);
            }
        }
    }
}
上一篇:CS-ExeplorerUtil
下一篇:CS-CommonUtil
网友评论