package checkSameFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CheckSameFile {
public static char[] hexChar = { '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
public static void main(String[] args) {
Map<String,List<File>> filemap=new HashMap<String,List<File>>();
printInfo("d:/ab", filemap);//修改路径判断对应路径下面的相同文件
}
/**
* 获得文件md5值
* @param fileName
* @param hashType
* @return
* @throws Exception
*/
public static String getHash(String fileName, String hashType)
throws Exception {
InputStream fis;
fis = new FileInputStream(fileName);
byte[] buffer = new byte[1024];
MessageDigest md5 = MessageDigest.getInstance(hashType);
int numRead = 0;
while ((numRead = fis.read(buffer)) > 0) {
md5.update(buffer, 0, numRead);
}
fis.close();
return toHexString(md5.digest());
}
/**
* md5转成字符串
* @param b
* @return
*/
public static String toHexString(byte[] b) {
StringBuilder sb = new StringBuilder(b.length * 2);
for (int i = 0; i < b.length; i++) {
sb.append(hexChar[(b[i] & 0xf0) >>> 4]);
sb.append(hexChar[b[i] & 0x0f]);
}
return sb.toString();
}
/**
* 无用
* @param path
*/
public static void getf(String path){
File f= new File(path);
if(f.isFile()){
System.out.println(f.getName());
}else{
File[] fs=f.listFiles();
for(File f0:fs){
getf(f0.getPath());
}
}
}
/**
* 将所有的文件装入map
* @param path
* @return
*/
public static void getSameFile(String path,Map<String,List<File>> filemap){
File f= new File(path);
if(f.isFile()){
String key;
try {
key = getHash(f.getPath(),"MD5");
if(filemap.containsKey(key)){
List<File> fd=filemap.get(key);
fd.add(f);
}else{
List<File> fs=new ArrayList<File>();
fs.add(f);
System.out.println(f.getName());
filemap.put(key, fs);
}
} catch (Exception e) {
e.printStackTrace();
}
}else{
File[] fs=f.listFiles();
for(File f0:fs){
getSameFile(f0.getPath(), filemap);
}
}
}
/**
* 打印判断结果
* @param path
* @param filemap
*/
public static void printInfo(String path,Map<String,List<File>> filemap){
getSameFile(path,filemap);
// System.out.println(filemap);
Collection<List<File>> sets=filemap.values();
int i=1;
for(List<File> f:sets){
// System.out.println(f.size());
if(f.size()>1){
System.out.println("-------------------");
System.out.println("第"+i+"组:以下"+f.size()+"文件内容相同:");
int j=1;
for(File f_0:f){
System.out.println(j+" 文件名字:"+f_0.getName()+"---文件路径:"+f_0.getPath()+"\n");
j++;
}
System.out.println("-------------------");
i++;
}
}
}
}
分享到:
相关推荐
在Java编程中,判断文件类型通常不是通过文件扩展名,而是通过读取文件的头部字节来识别。这是因为有些文件可能没有明确的扩展名,或者扩展名被恶意篡改。文件头内容通常包含特定的标识符,这些标识符是文件格式的...
### Java程序判断文件编码的类型 #### 知识点概览 本文档旨在教导读者如何通过Java编程语言来判断文件的编码类型。这包括常见的编码格式如GBK、UTF-8等。了解文件编码对于处理多语言环境下的文本数据至关重要。 ##...
本文将详细介绍如何使用Java来判断文件是否为UTF-8或GBK编码,并提供一个示例代码。 #### 文件编码基础知识 1. **UTF-8**:一种可变长度的字符编码,适用于所有Unicode字符,它通过使用一种巧妙的方案来表示各种...
综上所述,这个Java程序主要实现了两个功能:一是判断两个给定日期是否相同及计算它们之间的天数差;二是将给定日期向前或向后调整一定数量的天数。程序的核心是`DateType`类的设计与实现,它包含了日期的创建、打印...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
这段代码首先导入了`java.util.Scanner`类,然后创建了一个`Scanner`对象`input`来读取用户的输入。接着,我们通过`nextInt()`方法获取用户输入的年份,并将其存储在变量`year`中。接下来,我们使用逻辑运算符计算`...
在Java编程语言中,判断一个年份是否为...通过上述知识点,我们可以理解并实现一个简单的Java程序,用于判断输入的年份是否为闰年。在实际编程中,还可以根据需求增加更多的功能,比如处理多个年份、优化用户交互等。
Java如何实现判断文件的真实类型 Java判断文件真实类型是非常重要的,因为在文件传输过程中,为了安全验证,对于手工改动文件后缀名产生的伪造文件进行判断过滤。Java判断文件真实类型依靠的是文件的头部编码信息。...
例如,一个名为`main`的方法,其声明为`public static void main(String[] args)`,是Java程序的入口点。程序的执行始于`main`方法,因此它是任何Java应用程序的起点。 此外,学习如何处理异常也是Java编程中的重要...
- 判断文件是否以.shp或.zip结尾。 - `URL zipURL = new URL(base.getProtocol(), base.getHost(), base.getPort(), noExt + ext);` - 创建URL对象以获取ZIP文件。 - `URLConnection uc = zipURL.openConnection...
2. 一个程序中是否能存在两个访问权限为 public 的类?通过程序验证你的判断。 六、线程实验 实验目的:掌握 Java 多线程程序的特点,编译,调试及运行方法。 实验环境:Java 编译系统。 预备知识:线程及进程的...
注意,这段代码假设两个文件的大小相同且行数相同。如果文件大小不同或行数不同,需要更复杂的逻辑来处理。 通过以上步骤,我们就可以实现Java中基于流的TXT文件数据比较。这种方法不仅效率较高,而且代码结构清晰...
- **解析:** Java程序通常由一个或多个类组成,其中必须有一个包含`main`方法的类作为程序的入口点,这个类被称为主类。尽管可以定义多个类,但只有主类包含`public static void main(String[] args)`方法,这是程序...
* 添加音乐功能:使用 Java 的音频处理类库来添加音乐功能,使程序在翻开相同的图标时播放一段音乐,不同时播放另一段音乐 数据库通用查询系统 数据库通用查询系统旨在实现一个通用的数据库查询系统,能够满足不同...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...
Java 文件复制器是一种实用程序,用于在计算机上复制文件。在这个特定的代码示例中,我们看到一个名为 `FileCopy` 的类,该类包含了复制文件的核心逻辑。下面我们将详细探讨这个程序的关键部分以及实现文件复制所...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...
例如,本案例中提到的任务:有两个文本文件,一个是包含字符串列表的文件(`data1.txt`),另一个是包含需要替换的信息(`data2.txt`)。具体来说,任务要求按照`data2.txt`文件中的规则,对`data1.txt`文件中的特定...
这个压缩包包含了一个可以直接导入到Java项目的工具类,用于根据电话号码识别对应的运营商。以下将详细讲解如何实现这样的功能以及相关知识点。 首先,电话号码的判断主要依赖于国内三大运营商(中国移动、中国联通...