利用ClassLoader读取Jar包内部文件

    /**
     * 从依赖的Jar包中读取文件, Jar包内的文件是无法用File读取的,只能用Stream的方式读取。
     * 
     * @author lihzh
     * @throws URISyntaxException
     * @throws IOException
     * @data 2012-4-11 下午11:07:58
     */
    @Test
    public void testGetFileFromJarInClassPath() throws URISyntaxException,
            IOException {
        Enumeration<URL> urls = this.getClass().getClassLoader().getResources("conf/test.properties");
        URL url = this.getClass().getClassLoader().getResource("conf/test.properties");
        Assert.assertTrue(urls.hasMoreElements());
        Assert.assertNotNull(url);
        // 注意两种不同调用方式的路径的区别,此处如果不以“/” 开头,会被当作相对于当前类所在的包类处理,自然无法找到。
        // 因为在Class的getResource方法的开头,有一个resolveName方法,处理了传入的路径格式问题。而ClassLoader类里的
        // getResource和getResources均无此处理。使用时候需要用心。
        URL clzURL = this.getClass().getResource("/conf/test.properties");
        URL nullURL = this.getClass().getResource("conf/test.properties");
        Assert.assertNotNull(clzURL);
        Assert.assertNull(nullURL);
        URL thisClzURL = this.getClass().getResource("");
        Assert.assertNotNull(thisClzURL);
        // 开始读取文件内容
        InputStream is = this.getClass().getResourceAsStream("/conf/test.properties");
        Properties props = new Properties();
        props.load(is);
        Assert.assertTrue(props.containsKey("test.key"));
        Assert.assertEquals("thisIsValue", props.getProperty("test.key"));
    }

  读取Jar内某路径下的所有文件

    /**
     * 从ClassPath中的Jar包读取某文件夹下的所有文件
     * 
     * @author lihzh
     * @throws IOException 
     * @data 2012-4-13 下午10:22:24
     */
    @Test
    public void testGetFilesFromJarInClassPathWithDirPath() throws IOException {
        String dirPath = "conf/";
        URL url = this.getClass().getClassLoader().getResource(dirPath);
        Assert.assertNotNull(url);
        String urlStr = url.toString();
        // 找到!/ 截断之前的字符串
        String jarPath = urlStr.substring(0, urlStr.indexOf("!/") + 2);
        URL jarURL = new URL(jarPath);
        JarURLConnection jarCon = (JarURLConnection) jarURL.openConnection();
        JarFile jarFile = jarCon.getJarFile();
        Enumeration<JarEntry> jarEntrys = jarFile.entries();
        Assert.assertTrue(jarEntrys.hasMoreElements());
        Properties props = new Properties();
        while (jarEntrys.hasMoreElements()) {
            JarEntry entry = jarEntrys.nextElement();
            // 简单的判断路径,如果想做到想Spring,Ant-Style格式的路径匹配需要用到正则。
            String name = entry.getName();
            if (name.startsWith(dirPath) && !entry.isDirectory()) {
                // 开始读取文件内容
                InputStream is = this.getClass().getClassLoader().getResourceAsStream(name);
                Assert.assertNotNull(is);
                props.load(is);
            }
        }
        Assert.assertTrue(props.containsKey("test.key"));
        Assert.assertEquals("thisIsValue", props.getProperty("test.key"));
        Assert.assertTrue(props.containsKey("test.key.two"));
        Assert.assertEquals("thisIsAnotherValue", props.getProperty("test.key.two"));
    }

  对于不在ClassPath下的Jar包的读取,当作一个本地文件用JarFile读取即可。路径可使用路径。或者用上面的url.getConnection也可以处理。这里不再实现。