以下代码接受File对象,并使用它创建一个BasicFile对象。
package code.CustomFiles.File;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class BasicFile {
public String hash;
public File file;
BasicFile(File f){
file = f;
try{
compute_hash();
}catch(NoSuchAlgorithmException e){
this.hash = "NOSUCHALGO";
}
}
BasicFile(String filename, long size, String hash) throws IOException {
File f = new File(filename);
f.createNewFile();
RandomAccessFile r = new RandomAccessFile(f,"rw");
r.setLength(size);
r.close();
this.file=f;
this.hash=hash;
}
public void compute_hash() throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("MD5");
try(InputStream is = Files.newInputStream(file.toPath());
DigestInputStream dis = new DigestInputStream(is,md)){
}catch (IOException e) {
e.printStackTrace();
}
byte[] digest = md.digest();
this.hash = Base64.getEncoder().encodeToString(digest);
System.out.println(digest+" "+hash);
}
public String toString(){
return "Filepath: "+file+"\nHash: "+hash+"\n";
}
}
对BasicFile(File)
构造函数的多个调用的输出:-
[B@3abe666c 1B2M2Y8AsgTpgAmY7PhCfg==
[B@61e4d4fe 1B2M2Y8AsgTpgAmY7PhCfg==
[B@7dd92a4a 1B2M2Y8AsgTpgAmY7PhCfg==
[B@349dbe9b 1B2M2Y8AsgTpgAmY7PhCfg==
[B@6446bac9 1B2M2Y8AsgTpgAmY7PhCfg==
[B@23c2c19b 1B2M2Y8AsgTpgAmY7PhCfg==
[B@177d34d3 1B2M2Y8AsgTpgAmY7PhCfg==
[B@4ecd39c1 1B2M2Y8AsgTpgAmY7PhCfg==
我正在使用BasicFile(File)
构造函数创建多个BasicFile对象,但是似乎所有这些对象都具有与输出相同的BASE64编码的String。我不明白为什么?
来自Javadoc(我的重点是:)>
要完成消息摘要计算,请在关联的消息摘要上调用其中一种摘要方法在调用此摘要输入流的读取方法之一之后。
您创建了
DigestInputStream
,但从不读取任何内容。
但是所有函数似乎都具有与输出相同的BASE64编码String。我不明白为什么吗?