文件比较 提高工作效率

数字职场

在实际开发工作中,常常会用到文件比较,利用它来优化软件的性能、提高网站的工作效率,所以在招聘考试中,几乎不会缺少文件比较的题。

招聘题目:编码实现比较两个文件是否相同。

题目答案:

File f1 = new File("e:\\1.txt");

File f2= new File("e:\\2.txt");

byte[] b1 = new byte[(int) f1.length()];

byte[] b2=new byte[(int) f1.length()];

InputStream is1 = new FileInputStream(file1);

InputStream is2 = new FileInputStream(file2);

is1.read(b1);

is2.read(b2);

System.out.println(new String(b1));

System.out.println(new String(b2));

文件比较的用途

考官出此题的目的,是考查应聘者的编程基础。如果时间充裕应聘者在设计程序的时候,尽量考虑多一点,将实现目标构想得复杂一些,不管最后是否能全部实现,至少表现出较强的设计能力和逻辑思维能力,更容易获得考官的青睐。

在实际工作中,文件比较被广泛用到,例如恢复数据时通过数据比较,就可以只恢复消失的数据,大大提高了效率;网站更新图片时通过数据比较,可以避免更新重复的图片,也大大提高了效率。

小提示:文件比较主要有数据文件的比较和二进制文件的比较两种类型。数据文件的比较通常是在恢复数据存储的工作中,需要找出数据内容的不同处,并选择性地同步数据内容。二进制文件的比较通常用在检测文件是否被修改,例如有些病毒就会窜改系统文件。

实际开发中的文件比较

文件比较在实际开发中是如何运用的?是如何提高效率的呢?我们通过两段代码进行说明。代码要实现的目的是传入两个文件的路径,根据文件内容得出文件是否相同的结果。

代码1:public static boolean equalsFile(String file1,String file2) throws NoSuchAlgorithmException, IOException{

File f1 = new File(file1);

File f2= new File(file2);

//首先比较两个文件的大小

if(f1.length() == f2.length()){

//文件大小相同,则比较文件摘要

String sha1=getSha1(file1);

String sha2=getSha1(file2);

return sha1.equals(sha2);

}else{

//大小不同,文件内容不相同

//注意:如果是数据格式文件,不能使用这个方法,即使文件大小不同,内容也有可能相同

return false;

}

}

public static String getSha1(String fileuri) throws NoSuchAlgorithmException, IOException{

MessageDigest md = MessageDigest.getInstance("SHA1");

byte[] buffer = new byte[4096];

//将文件转换为流

DigestInputStream dis = new DigestInputStream(new FileInputStream(fileuri), md);

//按每4096字节读入文件流,并更新摘要信息

while (dis.read(buffer) != -1) {

dis.getMessageDigest().update(buffer);

}

dis.close();

//获取文件摘要信息

byte[] d1 = dis.getMessageDigest().digest();

//将二进制的摘要信息转换为大写字符串

点评:生成文件摘要,通过比较文件摘要来判断文件是否相同,这是一个高效的文件比较算法。如果将文件全部载入数组中进行比较,效率明显要低于这个方法。

代码2:public static boolean equalsFileex2(String file1,String file2) throws NoSuchAlgorithmException, IOException{

File f1 = new File(file1);

File f2= new File(file2);

//首先比较两个文件的大小

if(f1.length() == f2.length()){

//文件大小相同,则逐字节比较

BufferedInputStream bis1 = new BufferedInputStream(new FileInputStream(file1));

BufferedInputStream bis2 = new BufferedInputStream(new FileInputStream(file2));

int i;

while ( (i = bis1.read()) != -1) {

if (i != bis2.read()) {

return false;

}

}

if (bis2.read() != -1) {

return false;

}

return true;

}else{

//大小不同,文件内容不相同

//注意:如果是数据格式文件,不能使用这个方法,即使文件大小不同,内容也有可能相同

return false;

}

点评:这段代码是逐字节比较,通用于各种类型的文件比较,它的耗时与文件大小成正比。如果对300MB的文件进行比较,代码2耗时是代码1的两倍左右。