Java:IO/NIO篇,利用IO遍历目录示范(示范:从指定目录的JAR包中查找指定类)
2013-01-18 17:07
363 查看
1. 问题
因为项目有时需要查找一个类属于哪个JAR包,知道类名,知道大概路径,但不知道具体在哪个JAR包中,所以写了这样的一个小程序,来实现查找JAR包的作用。2. 解决
package com.clzhang.sample.io; import java.util.*; import java.io.*; import java.util.jar.*; /** * 这是一个从指定目录(包括子目录)的各种JAR/ZIP包中查找指定类文件的程序。 * 指定目录形如:C:\JavaApp\android-sdk-windows\platforms\android-17 * 指定目录也可以直接是一个JAR/ZIP包,比如: * C:\JavaApp\android-sdk-windows\platforms\android-17\data\layoutlib.jar * * 指定类形如:libcore.net.UriCodec * * 示范:可以从C:\JavaApp\android-sdk-windows\platforms\android-17\data目录中的layoutlib.jar包中找到:libcore.net.UriCodec类 * 也可以从C:\JavaApp\android-sdk-windows\platforms目录的子目录中找到:libcore.net.UriCodec类,需要时间稍长些而已。 * * @author acer * */ public class FindClassInJar { // 查找目录起始位置 private String m_libDir; // 需要查找的类名 private String m_classname; // 总计查找到的个数 int m_count = 0; // 构造器 libDir 查找目录起始位置 classname 需要查找的类名 public FindClassInJar(String libDir, String classname) { m_libDir = libDir; m_classname = classname; } // 文件过滤器,仅目录、JAR/ZIP文件格式通过 class JarZipFileFilter implements FileFilter { public boolean accept(File file) { if (file.isDirectory()) return true; String name = file.getName().toLowerCase(); if (name.endsWith(".jar") || name.endsWith(".zip")) { return true; } else { return false; } } } // 开始处理,与真实处理的分开了,主要原因是调用格式可能是从目录开始查找,也可能是从文件开始查找, // 所以让外界直接调用checkDirectory()方法似乎有些不太合适。 public void process() throws Exception { checkDirectory(m_libDir); } // 检查目录/文件,命名似乎有些不太合适,先这样吧。 private void checkDirectory(String libDir) throws Exception { File file = new File(libDir); if (file.isFile()) { // 允许不是目录,直接是一个文件(JAR、ZIP等) if (checkFile(file)) { m_count++; System.out.println(file.getName() + "包中包含了类:" + m_classname); } } else { File[] files = file.listFiles(new JarZipFileFilter()); for (int i = 0; i < files.length; i++) { File f = files[i]; if (f.isDirectory()) { checkDirectory(f.getAbsolutePath()); } else { System.out.println("正在检查:" + f.getAbsolutePath()); if (checkFile(f)) { m_count++; System.out.println(f.getName() + "包中包含了类:" + m_classname); } } } } } // 从JAR/ZIP包中查找类文件 private boolean checkFile(File f) { boolean result = false; try { JarFile jarFile = new JarFile(f); Enumeration<JarEntry> enu = jarFile.entries(); while (enu.hasMoreElements()) { JarEntry entry = enu.nextElement(); String name = entry.getName(); if (entry.isDirectory()) { continue; } if (name.equals(m_classname)) { result = true; break; } } jarFile.close(); } catch (Exception ex) { ex.printStackTrace(); } return result; } // 取得总计查找到的目标类数量 private int getCount() { return m_count; } public static void main(String args[]) throws Exception { String libDir = "D:\\Resources"; // String libDir = "C:\\JavaApp\\android-sdk-windows\\platforms\\android-17\\data\\layoutlib.jar"; String classname = "org.slf4j.impl.StaticLoggerBinder"; classname = classname.replaceAll("\\.", "/") + ".class"; System.out.println("开始在路径:" + libDir + "中查找:" + classname + "类......"); FindClassInJar ins = new FindClassInJar(libDir, classname); ins.checkDirectory(libDir); System.out.println("总计找到:" + ins.getCount() + "个符合要求的类!"); } }
相关文章推荐
- Java:IO/NIO篇,利用NIO遍历目录示范(示范:有选择地从光盘拷贝文件)
- 利用System.IO中的Directory类对指定的目录进行遍历
- Java中如何利用File类递归的遍历指定目录中的所有文件和文件夹
- Java利用递归思想遍历指定目录,获取所有的文件
- java 遍历指定目录下的文件夹并查找包含指定关键字的文件
- 如何利用Java遍历所有的指定文件目录下的所有文件
- 利用System.IO中的Directory类对指定的目录进行遍历 "
- 遍历文件Java中遍历出指定目录中的所有文件
- 利用IO的知识,实现一个程序列出某个目录下的所有的”.java”文件。
- Java利用反射如何查找使用指定注解的类详解
- Java-基础 文件操作IO 在指定目录中创建文件
- QT 遍历目录查找指定文件
- Java遍历列出某一目录下的文件及文件夹,寻找某一指定文件
- kettle利用参数遍历执行指定目录下的所有对象
- java.io.FileNotFoundException:file:\D:\code\xml-load\target\XX.jar!\XXX(文件名、目录名或卷标语法不正确。)
- 命令行编译运行Java程序时,加载指定目录中的Jar包
- jar包里查找指定的class文件,排查是否存在或重复,工具软件:Java Class Finder
- java遍历文件夹并复制文件到指定目录
- java.io.FileNotFoundException:file:\D:\code\xml-load\target\XX.jar!\XXX(文件名、目录名或卷标语法不正确。)
- Java设计模式之《组合模式》及应用场景(遍历指定路径下的文件目录和文件为例子)