最新版本的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]);
}