java遍歷resource目錄

最新版本的jdk 1.6 裏訪問resource的功能依然有限,只有class.getResource(name)和class.getResourceAsStream(name)兩個方法。實際使用中這兩個方法肯定不夠用。在此提供一個遍歷resource目錄的方法。
原理很簡單:
1. 未製作成jar包前,資源位於target/classes目錄下,這時遍歷目錄即可
2. 如果已經製作成jar包,資源位於jar包裏,枚舉當前JarFile即可

public static List enumerateDir(File dir) {

    List fileList = new ArrayList();
    if (dir == null) {

    } else if (dir.isDirectory()) {

        File[] subFiles = dir.listFiles();

        for (File subFile : subFiles) {

            fileList.add(subFile);
            if (subFile.isDirectory()) {
                fileList.addAll(enumerateDir(subFile));
            }

        }

    } else {
        fileList.add(dir);
    }

    return fileList;
}


 

/**
     * get resources by regular name. it works for files and also jars, and it's
     * compatible with WINDOWS and LINUX
     *
     * @author aaashun
     * @param clazz
     *            any java class that lives in the same place as the resources
     *            you want.
     * @param name
     *            you can use REGEX, not start with '/'.
     * @return name of each resource, NOTE: folder will not be included
     * @throws IOException
     */
    @SuppressWarnings("unchecked")
    public static String[] getResources(Class clazz, String name) throws IOException {

        Set resources = new HashSet();

        String classResourceName = clazz.getName().replace(".", "/") + ".class";
        URL classResourceURL = clazz.getClassLoader().getResource(classResourceName);
        String classResourcePath = classResourceURL.getPath();

        if (classResourceURL.getProtocol().equals("file")) {

            // 開發環境裏class和resource同位於target/classes目錄下
            String classesDirPath = classResourcePath.substring(classResourcePath.indexOf("/") + 1, classResourcePath
                    .indexOf(classResourceName));
            File classesDir = new File(classesDirPath);

            List files = enumerateDir(classesDir);
            for (File file : files) {

                String resourceName = file.getAbsolutePath();
                resourceName = resourceName.substring(classesDirPath.length());
                resourceName = resourceName.replace("//", "/");
                if (!file.isDirectory() && resourceName.matches(name)) {
                    resources.add(resourceName);
                }

            }

        } else if (classResourceURL.getProtocol().equals("jar")) {

            // 打包成jar包時,class和resource同位於jar包裏
            String jarPath = classResourcePath.substring(classResourcePath.indexOf("/"), classResourceURL.getPath()
                    .indexOf("!"));

            try {

                JarFile jarFile = new JarFile(URLDecoder.decode(jarPath, "UTF-8"));
                Enumeration jarEntries = jarFile.entries();

                while (jarEntries.hasMoreElements()) {

                    JarEntry jarEntry = jarEntries.nextElement();
                    String resourceName = jarEntry.getName();
                    if (resourceName.matches(name) && !jarEntry.isDirectory()) {
                        resources.add(resourceName);
                    }

                }

            } catch (UnsupportedEncodingException e) {
                // ignore
            }

        }

        return resources.toArray(new String[0]);

    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章