package jce;
import java.io.FileInputStream;
import java.security.DigestInputStream;
import java.security.MessageDigest;
public class InstanceCallbackDigest implements Runnable{
private String filename;
private InstanceCallbackDigestUserInterface callback;
public InstanceCallbackDigest(String filename, InstanceCallbackDigestUserInterface callback) {
this.filename = filename;
this.callback = callback;
}
@Override
public void run() {
try {
FileInputStream in = new FileInputStream(filename);
MessageDigest sha = MessageDigest.getInstance("SHA-256");
DigestInputStream din = new DigestInputStream(in, sha);
while(din.read() != -1);//파일 전체를 읽는다.
din.close();
byte[] digest = sha.digest();
callback.receveDigest(digest);
} catch (Exception e) {
System.err.println(e);
}
}
}
package jce;
import java.util.Arrays;
import javax.swing.plaf.synth.SynthScrollBarUI;
import javax.xml.bind.DatatypeConverter;
public class InstanceCallbackDigestUserInterface {
private String filename;
private byte[] digest;
public InstanceCallbackDigestUserInterface(String filename) {
super();
this.filename = filename;
}
public void calculateDigest(){
InstanceCallbackDigest cb = new InstanceCallbackDigest(filename, this);
Thread t = new Thread(cb);
t.start();
}
void receveDigest (byte[] digest){
this.digest = digest;
System.out.println(this);
}
@Override
public String toString() {
String result = filename+": ";
if(digest != null){
result+= DatatypeConverter.printHexBinary(digest);
}else{
result += "digest not available";
}
return result;
}
public static void main(String[] args) {
for(String filename: args){
//다이제스트 계산
InstanceCallbackDigestUserInterface d = new InstanceCallbackDigestUserInterface(filename);
d.calculateDigest();
}
}
}