62,614
社区成员
发帖
与我相关
我的任务
分享
/**
* @author zhy
* @version 1.0
* 比较文件MD5值,删除检索路径下的重复MD5值文件
* 已实现Md5值计算
* */
import java.security.MessageDigest;
import java.util.*;
import java.io.*;
import java.math.BigInteger;
import java.nio.*;
import java.nio.channels.FileChannel;
public class MainCode {
public static void main(String[] args) throws Exception {
System.out.println("请输入要检索的路径:");
Scanner sc = new Scanner(System.in);
String srcname= sc.nextLine(); //输入一个路径
File src=new File(srcname);
match(src); //将指定路径传入匹配操作方法
sc.close(); //关流操作
}
public static void match(File src) throws Exception {
HashSet<String> hs=new HashSet<String>(); //因为需要存储的MD5值是不同的,所以要用Set集合存储,确保值唯一
File[] srcFiles=src.listFiles(); //获取指定路径下的所有文件和子文件夹中的文件
String value = null; //用来接收计算出来的Md5值
FileInputStream fis = null; //申明一个读入流
MappedByteBuffer byteBuffer=null; //申明一个字节流
try {
for(File srcFile : srcFiles){
if(srcFile.isFile()){
fis = new FileInputStream(srcFile); //将遍历的每个文件路径给文件读入流
byteBuffer = fis.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, src.length());//
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(byteBuffer);
BigInteger bi = new BigInteger(1, md5.digest()); //将计算出的MD5值放入bigInteger
value = bi.toString(16); //将MD5值转换成字符串形式
if(hs.add(value)==false){ //判断计算的值,是否可以添加,添加不了说明文件重复
srcFile.delete(); // 将重复的文件删除
System.out.println(srcFile+"..."+value+"..."+"有重复文件,已删除");
}else{
hs.add(value); //将新MD5值添加到Set集合
System.out.println(srcFile+"..."+value);
}
}else if(srcFile.isDirectory()){ //如果是文件夹则递归调用本方法对子文件夹遍历
match(srcFile);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally { //确保关流,释放资源,MappedByteBuffer不是流他是直接映射的缓冲区所以不需要关流
if(fis!= null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
import java.security.MessageDigest;
import java.util.*;
import java.io.*;
import java.math.BigInteger;
import java.nio.*;
import java.nio.channels.FileChannel;
public class MainCode {
public static void main(String[] args) throws Exception {
System.out.println("请输入要检索的路径:");
Scanner sc = new Scanner(System.in);
String srcname = sc.nextLine(); // 输入一个路径
File src = new File(srcname);
match(src); // 将指定路径传入匹配操作方法
sc.close(); // 关流操作
}
public static void match(File src) throws Exception {
HashSet<String> hs = new HashSet<String>(); // 因为需要存储的MD5值是不同的,所以要用Set集合存储,确保值唯一
File[] srcFiles = src.listFiles(); // 获取指定路径下的所有文件和子文件夹中的文件
String value = null; // 用来接收计算出来的Md5值
FileInputStream fis = null; // 申明一个读入流
MappedByteBuffer byteBuffer = null; // 申明一个字节流
for (File srcFile : srcFiles) {
if (srcFile.isFile()) {
try {
fis = new FileInputStream(srcFile); // 将遍历的每个文件路径给文件读入流
byteBuffer = fis.getChannel().map(
FileChannel.MapMode.READ_ONLY, 0, srcFile.length());//这个地方忘了改了
} catch (Exception e) {
e.printStackTrace();
} finally { // 确保关流,释放资源,MappedByteBuffer不是流他是直接映射的缓冲区所以不需要关流
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(byteBuffer);
BigInteger bi = new BigInteger(1, md5.digest()); // 将计算出的MD5值放入bigInteger
value = bi.toString(30); // 将MD5值转换成字符串形式
if (hs.add(value) == false) { // 判断计算的值,是否可以添加,添加不了说明文件重复
srcFile.delete(); // 将重复的文件删除
System.out.println(srcFile + "..." + value + "..."
+ "有重复文件,已删除");
} else {
hs.add(value); // 将新MD5值添加到Set集合
System.out.println(srcFile + "..." + value);
}
} else if (srcFile.isDirectory()) { // 如果是文件夹则递归调用本方法对子文件夹遍历
match(srcFile);
}
}
}
}
srcFile那忘了改了
import java.security.MessageDigest;
import java.util.*;
import java.io.*;
import java.math.BigInteger;
import java.nio.*;
import java.nio.channels.FileChannel;
public class MainCode {
public static void main(String[] args) throws Exception {
System.out.println("请输入要检索的路径:");
Scanner sc = new Scanner(System.in);
String srcname = sc.nextLine(); // 输入一个路径
File src = new File(srcname);
match(src); // 将指定路径传入匹配操作方法
sc.close(); // 关流操作
}
public static void match(File src) throws Exception {
HashSet<String> hs = new HashSet<String>(); // 因为需要存储的MD5值是不同的,所以要用Set集合存储,确保值唯一
File[] srcFiles = src.listFiles(); // 获取指定路径下的所有文件和子文件夹中的文件
String value = null; // 用来接收计算出来的Md5值
FileInputStream fis = null; // 申明一个读入流
MappedByteBuffer byteBuffer = null; // 申明一个字节流
for (File srcFile : srcFiles) {
if (srcFile.isFile()) {
try {
fis = new FileInputStream(srcFile); // 将遍历的每个文件路径给文件读入流
byteBuffer = fis.getChannel().map(
FileChannel.MapMode.READ_ONLY, 0, src.length());//
} catch (Exception e) {
e.printStackTrace();
} finally { // 确保关流,释放资源,MappedByteBuffer不是流他是直接映射的缓冲区所以不需要关流
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(byteBuffer);
BigInteger bi = new BigInteger(1, md5.digest()); // 将计算出的MD5值放入bigInteger
value = bi.toString(30); // 将MD5值转换成字符串形式
if (hs.add(value) == false) { // 判断计算的值,是否可以添加,添加不了说明文件重复
srcFile.delete(); // 将重复的文件删除
System.out.println(srcFile + "..." + value + "..."
+ "有重复文件,已删除");
} else {
hs.add(value); // 将新MD5值添加到Set集合
System.out.println(srcFile + "..." + value);
}
} else if (srcFile.isDirectory()) { // 如果是文件夹则递归调用本方法对子文件夹遍历
match(srcFile);
}
}
}
}
不好意思刚才没有看清楚问题。
如果操作的文件的流Strame没有关闭,通过File.delete方法删除文件会失败。
import java.security.MessageDigest;
import java.util.*;
import java.io.*;
import java.math.BigInteger;
import java.nio.*;
import java.nio.channels.FileChannel;
public class MainCode {
public static void main(String[] args) throws Exception {
System.out.println("请输入要检索的路径:");
Scanner sc = new Scanner(System.in);
String srcname = sc.nextLine(); // 输入一个路径
File src = new File(srcname);
match(src); // 将指定路径传入匹配操作方法
sc.close(); // 关流操作
}
public static void match(File src) throws Exception {
HashSet<String> hs = new HashSet<String>(); // 因为需要存储的MD5值是不同的,所以要用Set集合存储,确保值唯一
File[] srcFiles = src.listFiles(); // 获取指定路径下的所有文件和子文件夹中的文件
String value = null; // 用来接收计算出来的Md5值
FileInputStream fis = null; // 申明一个读入流
MappedByteBuffer byteBuffer = null; // 申明一个字节流
try {
for (File srcFile : srcFiles) {
if (srcFile.isFile()) {
fis = new FileInputStream(srcFile); // 将遍历的每个文件路径给文件读入流
byteBuffer = fis.getChannel().map(
FileChannel.MapMode.READ_ONLY, 0, srcFile.length());//这应该是文件的大小而不是根文件夹
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(byteBuffer);
BigInteger bi = new BigInteger(1, md5.digest()); // 将计算出的MD5值放入bigInteger
value = bi.toString(16); // 将MD5值转换成字符串形式
if (hs.add(value) == false) { // 判断计算的值,是否可以添加,添加不了说明文件重复
srcFile.delete(); // 将重复的文件删除
System.out.println(srcFile + "..." + value + "..."
+ "有重复文件,已删除");
} else {
hs.add(value); // 将新MD5值添加到Set集合
System.out.println(srcFile + "..." + value);
}
} else if (srcFile.isDirectory()) { // 如果是文件夹则递归调用本方法对子文件夹遍历
match(srcFile);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally { // 确保关流,释放资源,MappedByteBuffer不是流他是直接映射的缓冲区所以不需要关流
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
import java.security.MessageDigest;
import java.util.*;
import java.io.*;
import java.math.BigInteger;
import java.nio.*;
import java.nio.channels.FileChannel;
public class MainCode {
public static void main(String[] args) throws Exception {
System.out.println("请输入要检索的路径:");
Scanner sc = new Scanner(System.in);
String srcname = sc.nextLine(); // 输入一个路径
File src = new File(srcname);
match(src); // 将指定路径传入匹配操作方法
sc.close(); // 关流操作
}
public static void match(File src) throws Exception {
HashSet<String> hs = new HashSet<String>(); // 因为需要存储的MD5值是不同的,所以要用Set集合存储,确保值唯一
File[] srcFiles = src.listFiles(); // 获取指定路径下的所有文件和子文件夹中的文件
String value = null; // 用来接收计算出来的Md5值
FileInputStream fis = null; // 申明一个读入流
MappedByteBuffer byteBuffer = null; // 申明一个字节流
try {
for (File srcFile : srcFiles) {
if (srcFile.isFile()) {
fis = new FileInputStream(srcFile); // 将遍历的每个文件路径给文件读入流
byteBuffer = fis.getChannel().map(
FileChannel.MapMode.READ_ONLY, 0, srcFile.length());//这应该是文件的大小而不是根文件夹
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(byteBuffer);
BigInteger bi = new BigInteger(1, md5.digest()); // 将计算出的MD5值放入bigInteger
value = bi.toString(16); // 将MD5值转换成字符串形式
if (hs.add(value) == false) { // 判断计算的值,是否可以添加,添加不了说明文件重复
srcFile.delete(); // 将重复的文件删除
System.out.println(srcFile + "..." + value + "..."
+ "有重复文件,已删除");
} else {
hs.add(value); // 将新MD5值添加到Set集合
System.out.println(srcFile + "..." + value);
}
} else if (srcFile.isDirectory()) { // 如果是文件夹则递归调用本方法对子文件夹遍历
match(srcFile);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally { // 确保关流,释放资源,MappedByteBuffer不是流他是直接映射的缓冲区所以不需要关流
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}