不同于使用FileInputStream和FileOutputStream读写文件,RadomAccessFile支持随机访问文件的方式。下面是官方的解释:
Allows reading from and writing to a file in a random-access manner.
This is different from the uni-directional sequential access that a {@link FileInputStream} or {@link FileOutputStream} provides.
If the file is opened in read/write mode, write operations are available as well.
The position of the next read or write operation can be moved forwards and backwards after every operation.
如何使用RandomAccessFile获取文件的MD5值:
1.通过MessageDigest.getInstance("MD5")得到MessageDigest实例。
2.创建RadomAccessFile的一个实例。
3.通过RadomAccessFile.read()读取文件,并调用MessageDigest.update()更新MessageDigest。
4.将MessageDigest转化为16进制的字符串(即MD5值)。
以下是相关代码:
publicclassMD5Util {privatestaticfinalint STREAM_BUFFER_LENGTH = 1024;
privatestatic MessageDigest messagedigest = null;
static{
try{
messagedigest = MessageDigest.getInstance("MD5");
}catch(NoSuchAlgorithmException e){
System.err.println(String.format("Initialization error , MessageDigest is not support %s : %s",
MD5Util.class.getName(),e.getMessage()));
}
}
/**
*获取一般文件的md5值
*/publicstatic String getFileMD5(String path){
File file = new File(path);
if (!file.exists() || !file.isFile()) {
returnnull;
}
byte[] buffer = newbyte[STREAM_BUFFER_LENGTH * 8];
RandomAccessFile rf = null;
int len;
try{
rf = new RandomAccessFile(path,"r");
while ((len = rf.read(buffer)) != -1){
messagedigest.update(buffer,0,len);
}
}catch (IOException e){
System.err.println(String.format("Class %s File %s can not read : %s",
MD5Util.class.getName(), file.getAbsolutePath(),e.getMessage()));
}finally {
if(rf != null){
try{
rf.close();
}catch (IOException e){
System.err.println(String.format("Class %s File %s's RandomAccessFile can not close : %s",
MD5Util.class.getName(), file.getAbsolutePath(),e.getMessage()));
}
}
}
BigInteger integer = new BigInteger(1, messagedigest.digest());
return integer.toString(16);
}