Java Threads

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();
            }
        }
    }
}

Leave a Comment

Your email address will not be published. Required fields are marked *