The code below seems to result to threads that never stops.
//CallBackDigest.java
import java.io.*;
import java.security.DigestInputStream;
import java.security.MessageDigest;
public class CallBackDigest implements Runnable {
private String filename;
private CallBackDigestUserInterface cb;
public CallBackDigest(String filename, CallBackDigestUserInterface cb){
this.filename = filename;
this.cb = cb;
}
@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); // Continuosly read until end of file
din.close();
byte[] digest = sha.digest();
cb.receiveDigest(digest);
} catch (Exception e){
System.err.println(e);
}
}
}
// CallBackDigestUserInterface.java
import java.io.File;
import jakarta.xml.bind.*;
public class CallBackDigestUserInterface {
private String filename;
private byte[] digest;
public CallBackDigestUserInterface(String filename){
this.filename = filename;
}
public void calculateDigest(){
CallBackDigest cb = new CallBackDigest(filename, this);
Thread t = new Thread(cb);
t.start();
}
public void receiveDigest (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){
File folder = new File("/etc");
File[] files = folder.listFiles();
for (File f : files){
if (f.isFile()){
CallBackDigestUserInterface cb = new CallBackDigestUserInterface(f.getAbsolutePath());
cb.calculateDigest();
}
}
}
}
Below is a code that except from using callback is the same with above logically that works fine
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import jakarta.xml.bind.*;
public class DigestThread implements Runnable{
private String filename;
public DigestThread(String filename){
this.filename = filename;
}
@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();
StringBuilder result = new StringBuilder(filename);
result.append(": ");
result.append(DatatypeConverter.printHexBinary(digest));
System.out.println(result);
} catch (IOException e){
System.err.println(e);
} catch (NoSuchAlgorithmException e){
System.err.println(e);
}
}
public static void main (String[] args){
File folder = new File("/etc");
File[] files = folder.listFiles();
for (File f : files){
if (f.isFile()){
Runnable r = new DigestThread(f.getAbsolutePath());
Thread t = new Thread(r);
t.start();
}
}
}
}