⑴ 如何用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這個方法)