⑴ 如何用java判断两个文件内容是否相同
如果你维护这些文件列表,并且后期会不定期进行比较,也就是确定一个文件有多次被比较的机会。可以计算这些文件的MD5并缓存起来,后期直接用MD5进行比较。
如果只是临时性的随机选两个文件进行比较,可以先比较文件大小,如果文件大小不同就说明文件内容不相同。如果大小相等的话,可以打开这两个文件的输入流,字节逐一比较,如果中间有不相等的字节就说明两个文件不相等,然后直接退出比较,需要注意的是文件流要缓冲(BufferedInputStream)。
之所以不推荐MD5是因为MD5也需要根据文件全部内容计算散列值,可是实际上中途发现有一个字节不相同就可以判定这两个文件是不同的,根本没必要去读取文件的全部内容。
//in1, in2为两个文件的输入流,最后注意流的关闭
int c;
while ((c = in1.read()) != -1) {
if (in2.read() != c) return false;
}
return true;
⑵ 如何将java文件内容进行比较
比较文件的MD5即可
import java.io.File;
import java.io.FileInputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;
public class FileDigest {
/**
* 获取单个文件的MD5值!
* @param file
* @return
*/
public static String getFileMD5(File file) {
if (!file.isFile()){
return null;
}
MessageDigest digest = null;
FileInputStream in=null;
byte buffer[] = new byte[1024];
int len;
try {
digest = MessageDigest.getInstance("MD5");
in = new FileInputStream(file);
while ((len = in.read(buffer, 0, 1024)) != -1) {
digest.update(buffer, 0, len);
}
in.close();
} catch (Exception e) {
e.printStackTrace();
return null;
}
BigInteger bigInt = new BigInteger(1, digest.digest());
return bigInt.toString(16);
}
/**
* 获取文件夹中文件的MD5值
* @param file
* @param listChild ;true递归子目录中的文件
* @return
*/
public static Map<String, String> getDirMD5(File file,boolean listChild) {
if(!file.isDirectory()){
return null;
}
//<filepath,md5>
Map<String, String> map=new HashMap<String, String>();
String md5;
File files[]=file.listFiles();
for(int i=0;i<files.length;i++){
File f=files[i];
if(f.isDirectory()&&listChild){
map.putAll(getDirMD5(f, listChild));
} else {
md5=getFileMD5(f);
if(md5!=null){
map.put(f.getPath(), md5);
}
}
}
return map;
}
public static void main(String[] args) {
File file1 = new File("a.txt");
File file2 = new File("b.txt");
System.out.println(getFileMD5(file1).equals(getFileMD5(file2)));
}
}
⑶ java比较2个文件是否是相同的文件,是一个一个字节比较还是计算MD5比较好啊
不同内容得出相同MD5值,虽然概率低,但总是不放心。如果在已知文件编码范围的条件下,找到MD5绝对区分长度范围(即:该范围内取样内容的MD5相同的,内容保证相同;绝不存在不同内容得出相同MD5值的现象),那么,可按合理的长度分片、按一定顺序遍历整个文件(属性信息、头部、尾部、同步随机点、其他),比较MD5,一旦有异立即判定文件不同,终止比较。这种分片取样比较MD5的思路可能快于逐字节比较也绝对可信
要确保 100%正确就必须校验全文,通过以上思路来比较,即是。
(注:
其他据说相对于MD5来讲不易碰撞(即不同内容得出相同MD5值的概率可能更低)的算法推荐:起码 SHA1 ,最好 SHA256、 SHA512、MD5+CRC32、HMAC,或者几种不同类型算法的同步进行。
在精通算法的情况下,将这里推荐的算法取代上文中提到的MD5来考量,能扩大绝对区分长度范围,可能更方便更快的比较。
但是又有这样的考虑:逐字节比较的算法最简单,算法弄复杂了反而会增加额余的时间;逐字节比较的算法也可以放到上文中来考量,进行同步取样和各种遍历的顺序与方式,说不定,在保证100%的可信度的条件下,逐字比较反而最快呢?
我觉得时间的耗费关键处在于,所有的算法,都要将两个位于不同区域或载体的文件的同位区域收集到一起进行比较,这个收集花费时间Ta(i),与取样长度、存储区域或载体等相关;{如果要将文件取很大一部或全部读入内存,然后再逐一集中比较,则会减小以上的Ta(i),而增加一个额外读入的时间Tc(i)*次数M(i)}。比较的次数大致为N(i);而如果在一个文件中顺序读取一个区域并且计算它的某个整体评定值,这个花费的时间为Tb(i),与取样长度、计算程序、设备性能等相关。
总体的比较时间大致是Ta(i)*N(i)*Tb(i)+{Tc(i)*M(i)}
逐字节比较,其中Tb(i)、Ta(i)都是最短的,但是N(i)最大,
总之,可以设计不同的算法,通过实际环境和文件的检测,来决定采用何种算法。
)
外一则:
两个取样内容, MD5等算法的计算值 不同,则内容一定不同; 计算值相同,则 内容可能相同,但可能性是否达到100%,内容相同的概率是多少,根据编码范围、算法来确定。如果是比较一个文件和许多其他文件是否相同,并且提前知道其他文件的 MD5 值,可先比较 MD5 值可以大大提高文件比较的速度。
⑷ 有两个名字一样的java文件,怎样比较其内容的不同地方(一个是以前写的,一个更新的程序)有什么方法
1、如果一个是本地文件,一个是svn服务器上的,可以直接使用eclipse里面svn的“比较对象”——“资源库中的最新内容”(你的应该是英文)
2、UltraEdit中“文件”——“比较文件”,选中要比较的两个文件即可。
⑸ 如何用Java判断两个文件内容是否相同
//判断的办法是分别将两个文件读进来
//先判断着两个文件的长度,如果长度不一样,那肯定不一样
//如果两个文件的长度(大小)一样,那么就对文件中的每一个字节进行比对
//只要有一个字节不同,两个文件就不同。
//否则两个文件就是相同的
//代码如下:(JDK1.4+)(代码格式被吃掉了,请自己手工排一下)
package 兲髙亻壬鸟飞;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Answer1 {
public static void main(String[] args) {
//文件名要用绝对路径
//相对路径也可以,但是容易弄错
String fileName1 = "xxx";//写你需要判断的第一个文件的文件名
String fileName2 = "yyy";//写你需要判断的第二个文件的文件名
FileInputStream fis1 = null;
FileInputStream fis2 = null;
try {
fis1 = new FileInputStream(fileName1);
fis2 = new FileInputStream(fileName2);
int len1 = fis1.available();
int len2 = fis2.available();
if (len1 == len2) {//长度相同,则比较具体内容
//建立两个字节缓冲区
byte[] data1 = new byte[len1];
byte[] data2 = new byte[len2];
//分别将两个文件的内容读入缓冲区
fis1.read(data1);
fis2.read(data2);
//依次比较文件中的每一个字节
for (int i=0; i<len1; i++) {
//只要有一个字节不同,两个文件就不一样
if (data1[i] != data2[i]) {
System.out.println("文件内容不一样");
return;
}
}
System.out.println("两个文件完全相同");
} else {
//长度不一样,文件肯定不同
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {//关闭文件流,防止内存泄漏
if (fis1 != null) {
try {
fis1.close();
} catch (IOException e) {
//忽略
e.printStackTrace();
}
}
if (fis2 != null) {
try {
fis2.close();
} catch (IOException e) {
//忽略
e.printStackTrace();
}
}
}
}
}
⑹ java如何快速比较两个文件是否相同
计算MD5或SHA-1,一样的就是同一个文件
下面的代码,不需要额外使用第三方组件,且支持超大文件
//计算文件的MD5值
publicstaticStringgetFileMD5(Filefile){
if(!file.isFile()){
returnnull;
}
MessageDigestdigest=null;
FileInputStreamin=null;
bytebuffer[]=newbyte[8192];
intlen;
try{
digest=MessageDigest.getInstance("MD5");
in=newFileInputStream(file);
while((len=in.read(buffer))!=-1){
digest.update(buffer,0,len);
}
BigIntegerbigInt=newBigInteger(1,digest.digest());
returnbigInt.toString(16);
}catch(Exceptione){
e.printStackTrace();
returnnull;
}finally{
try{
in.close();
}catch(Exceptione){
e.printStackTrace();
}
}
}
//计算文件的SHA-1值
publicstaticStringgetFileSha1(Filefile){
if(!file.isFile()){
returnnull;
}
MessageDigestdigest=null;
FileInputStreamin=null;
bytebuffer[]=newbyte[8192];
intlen;
try{
digest=MessageDigest.getInstance("SHA-1");
in=newFileInputStream(file);
while((len=in.read(buffer))!=-1){
digest.update(buffer,0,len);
}
BigIntegerbigInt=newBigInteger(1,digest.digest());
returnbigInt.toString(16);
}catch(Exceptione){
e.printStackTrace();
returnnull;
}finally{
try{
in.close();
}catch(Exceptione){
e.printStackTrace();
}
}
}
⑺ java如何判断俩个文件是否相同的
//判断的办法是分别将两个文件读进来
//先判断着两个文件的长度,如果长度不一样,那肯定不一样
//如果两个文件的长度(大小)一样,那么就对文件中的每一个字节进行比对
//只要有一个字节不同,两个文件就不同。
//否则两个文件就是相同的
//代码如下:(JDK1.4+)(代码格式被吃掉了,请自己手工排一下)
package 兲髙亻壬鸟飞;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Answer1 {
public static void main(String[] args) {
//文件名要用绝对路径
//相对路径也可以,但是容易弄错
String fileName1 = "xxx";//写你需要判断的第一个文件的文件名
String fileName2 = "yyy";//写你需要判断的第二个文件的文件名
FileInputStream fis1 = null;
FileInputStream fis2 = null;
try {
fis1 = new FileInputStream(fileName1);
fis2 = new FileInputStream(fileName2);
int len1 = fis1.available();
int len2 = fis2.available();
if (len1 == len2) {//长度相同,则比较具体内容
//建立两个字节缓冲区
byte[] data1 = new byte[len1];
byte[] data2 = new byte[len2];
//分别将两个文件的内容读入缓冲区
fis1.read(data1);
fis2.read(data2);
//依次比较文件中的每一个字节
for (int i=0; i<len1; i++) {
//只要有一个字节不同,两个文件就不一样
if (data1[i] != data2[i]) {
System.out.println("文件内容不一样");
return;
}
}
System.out.println("两个文件完全相同");
} else {
//长度不一样,文件肯定不同
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {//关闭文件流,防止内存泄漏
if (fis1 != null) {
try {
fis1.close();
} catch (IOException e) {
//忽略
e.printStackTrace();
}
}
if (fis2 != null) {
try {
fis2.close();
} catch (IOException e) {
//忽略
e.printStackTrace();
}
}
}
}
}
⑻ 如何用Java判断两个文件内容是否相同
//判断的办法是分别将两个文件读进来
//先判断着两个文件的长度,如果长度不一样,那肯定不一样
//如果两个文件的长度(大小)一样,那么就对文件中的每一个字节进行比对
//只要有一个字节不同,两个文件就不同。
//否则两个文件就是相同的
//代码如下:(JDK1.4+)(代码格式被吃掉了,请自己手工排一下)
package 兲髙亻壬鸟飞;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Answer1 {
public static void main(String[] args) {
//文件名要用绝对路径
//相对路径也可以,但是容易弄错
String fileName1 = "xxx";//写你需要判断的第一个文件的文件名
String fileName2 = "yyy";//写你需要判断的第二个文件的文件名
FileInputStream fis1 = null;
FileInputStream fis2 = null;
try {
fis1 = new FileInputStream(fileName1);
fis2 = new FileInputStream(fileName2);
int len1 = fis1.available();
int len2 = fis2.available();
if (len1 == len2) {//长度相同,则比较具体内容
⑼ 用Java写一个类,用来比较两个文件夹中的文件:
给你个思路(自己仔细做做,其实不难):
1、查找两个文件中所有的文件很简单,使用两个map,把文件名加上文件大小作为键,把文件所在的路径加上A或者B作为值,这样能够得到连个map,解决问题一
2、重新定义一个map,将B文件生成的map添加进新的map,然后将A文件生成的map添加进新map(新添加的时候判断map的健是不是已经存在,如果存在,将该键的值改成A文件的路径)
3、遍历新生成的map,如果map元素键对应的value中包含了B而没有包含A就说明,这个文件在B文件夹中,而没有在A文件夹中(可以使用contains这个方法)