1:问题场景
01:提取某个包下边的.class文件的hash值(文件hash提取不再赘述)
02:文件在我本地,以及两台测试服务器上的读取顺是一致的,我就没有去在意,但是在项目现场出现文件读取不一致情况
03:解决思路,将文件路径都存入list中,再对list进行排序
2:代码
public static String getHash(String pack) throws Exception { //入口
//重置code码
code = "";
String codelist = "";
listCode = new ArrayList<String>();
String packageName = pack;
String packageDirName = packageName.replace('.', '/');
try {
Enumeration<URL> dirs = Thread.currentThread()
.getContextClassLoader().getResources(packageDirName);
// 循环迭代下去
while (dirs.hasMoreElements()) {
// 获取下一个元素
URL url = dirs.nextElement();
// 得到协议的名称
// String protocol = url.getProtocol();
// 获取包的物理路径
String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
toHash(filePath);
Object[] array = hashList.toArray();
Arrays.sort(array);
toHashList(array);
}
} catch (IOException e) {
e.printStackTrace();
}
for(String codes : listCode) {
codelist += codes;
}
return codelist;
}
private static void toHashList(Object[] array) throws Exception{
for(Object str : array) {
String strfile = (String)str;
File file = new File(strfile);
if (file.isFile() && file.getName().lastIndexOf(".class") != -1) {
HashMethod hm = new HashMethod();
String hash = hm.getHash(file.toString());
// 取每个.class文件的hashCode的后5位进行拼接
hash = hash.substring(hash.length() - 5);
listCode.add(hash);
}
}
}
private static void toHash(String filePath) throws Exception { //文件夹层级不深,采用递归,文件夹深的话不要递归容易读死
File[] listFiles = new File(filePath).listFiles();
for (File file : listFiles) {
if(file.isDirectory()) {
toHash(file.toString());
}else {
hashList.add(file.toString());
}
}
}
敬请留言!