当前位置:首页 >> 异常处理集锦

{$data.title}


学习java有一段时间了,今天突然碰到一个难题,那就是如何用java程序快速的对现有的将近100多个jar包进行解压缩,然后读取里面的java文件的内容,纯手工是肯定不行的,比较慢,而且现在是100个,如果有10000个jar包那该怎么办?下面就给出对应的源代码:
首先给出单个的java对jar包或者zip,rar压缩解压缩的代码:
package com.biye.dealjar;

import java.io.File;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.nio.ByteBuffer;  
import java.nio.channels.Channels;  
import java.nio.channels.FileChannel;  
import java.nio.channels.ReadableByteChannel;  
import java.util.Enumeration;  
import java.util.jar.JarEntry;  
import java.util.jar.JarFile;  
 
/**
 * Jar文件工具
 * @author WangYanCheng
 * @version 2013-1-21
 */  
public class JarFileUtil {  
 
    /**
     * 解压Jar文件
     * @param jarFile 指定jar文件
     * @param tarDir 指定解压文件夹
     * @throws IOException 抛出异常
     */  
    public static void uncompress(File jarFile, File tarDir) throws IOException {  
        JarFile jfInst = new JarFile(jarFile);  
        Enumeration<JarEntry> enumEntry = jfInst.entries();  
        while (enumEntry.hasMoreElements()) {  
            JarEntry jarEntry = enumEntry.nextElement();  
            //构造解压文件实体  
            File tarFile = new File(tarDir, jarEntry.getName());  
            //创建文件  
            makeFile(jarEntry, tarFile);  
            if (jarEntry.isDirectory()) {  
                continue;  
            }  
            //构造输出流  
            FileChannel fileChannel = new FileOutputStream(tarFile).getChannel();  
            //取输入流  
            InputStream ins = jfInst.getInputStream(jarEntry);  
            transferStream(ins, fileChannel);  
        }  
    }  
 
    /**
     * 流交换
     * @param ins 输入流
     * @param targetChannel 输出流
     */  
    private static void transferStream(InputStream ins, FileChannel targetChannel) {  
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024 * 10);  
        ReadableByteChannel rbcInst = Channels.newChannel(ins);  
        try {  
            while (-1 != (rbcInst.read(byteBuffer))) {  
                byteBuffer.flip();  
                targetChannel.write(byteBuffer);  
                byteBuffer.clear();  
            }  
        } catch (IOException ioe) {  
            ioe.printStackTrace();  
        } finally {  
            if (null != rbcInst) {  
                try {  
                    rbcInst.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
            if (null != targetChannel) {  
                try {  
                    targetChannel.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  
 
    /**
     * 打印jar文件内容信息
     * @param fileInst jar文件
     */  
    public static void printJarEntry(File fileInst) {  
        JarFile jfInst = null;;  
        try {  
            jfInst = new JarFile(fileInst);  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        Enumeration<JarEntry> enumEntry = jfInst.entries();  
        while (enumEntry.hasMoreElements()) {  
            System.out.println((enumEntry.nextElement()));  
        }  
    }  
 
    /**
     * 创建文件
     * @param jarEntry jar实体
     * @param fileInst 文件实体
     * @throws IOException 抛出异常
     */  
    public static void makeFile(JarEntry jarEntry, File fileInst) {  
        if (!fileInst.exists()) {  
            if (jarEntry.isDirectory()) {  
                fileInst.mkdirs();  
            } else {  
                try {  
                    fileInst.createNewFile();  
                } catch (IOException e) {  
                    System.out.println("创建文件失败>>".concat(fileInst.getPath()));  
                }  
            }  
        }  
    }  
}
好了,只要是稍微有点编程经验的人,就可以实现批量的对100个jar包进行操作了,下面只给出具体的解决思路,就不附源码了:
1.首先读取这100个jar包的路径,然后循环调用上面的单个的解压缩函数
2.最后针对解压缩出来的文件,进行对应文件的读取。
ok,大功告成,希望对大家有所帮助。