当我们有几份文件,想知道它们是否相同时,可以使用Java的哈希算法进行简单的检查。
一、读取需要检查的文件
public class Test {
public static void main(String[] args) {
try {
Files.walkFileTree(Paths.get("D:\\Test\\实验案例\\作业"), new MyFileVisitor());
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、创建一个继承SimpleFileVisitor的类,并在里面写入核心的实现代码
class MyFileVisitor extends SimpleFileVisitor<Path> {
private HashSet<String> set = new HashSet<String>();
private HashMap<String, Path> map = new HashMap<String, Path>();
// 访问文件
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
// 读取读取文件的所有字节值
byte[] bytes = Files.readAllBytes(file);
// 计算当前文件哈希值
String hash = hash(bytes);
Path OldFile = map.put(hash, file);
if (OldFile != null) {
System.out.println(file);
System.out.println(OldFile);
System.out.println();
}
return FileVisitResult.CONTINUE;
}
public static String hash(byte[] bytes) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");// SHA-512
// 传入原始信息
md.update(bytes);
// 计算哈希值
byte[] hashBytes = md.digest();
// 转换成16进制
StringBuilder ret = new StringBuilder();
for (byte b : hashBytes) {
ret.append(String.format("%02x", b));
}
return ret.toString();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "error";
}
}
}