文件比较 提高工作效率
数字职场
在实际开发工作中,常常会用到文件比较,利用它来优化软件的性能、提高网站的工作效率,所以在招聘考试中,几乎不会缺少文件比较的题。
招聘题目:编码实现比较两个文件是否相同。
题目答案:
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的两倍左右。