一 概述 
       
       前面已经实现了 采用静态函数 , 实例函数 ,下面主要讲使用回调对象列表的方式。
  
      1  首先是一个接口类
           任何想获得线程结果的函数,都需要实现这个接口  
 
package cn.bupt.thread;

public interface DigestListener {

    
public void digestCalculated(byte [] digest) ;
}


     2  下面是一个线程类 

          该类的成员变量有维护一个vector , 里面存储的是想与该线程交互的对象 , 这些对象都实现了 上面的特定接口。

         
package cn.bupt.thread;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;

public class ListCallbackDigest implements Runnable{

    
private File input ;
    List listener 
= new Vector() ;
    
    
public ListCallbackDigest(File input)
    
{
      
this.input = input ;    
    }

    
    
public synchronized void addDigestListener(DigestListener l)
    
{
        listener.add(l) ;
        
    }

    
    
public synchronized void removeDigestListener(DigestListener l)
    
{
        listener.remove(l) ;
        
    }

    
    
    
public synchronized void sendDigest(byte [] digest){
        
        ListIterator iterator 
= listener.listIterator() ;
        
while(iterator.hasNext())
        
{
            
/*
             *  调用容器中的方法
             
*/

            DigestListener dl 
= (DigestListener) iterator.next() ;
            
/*调用主类中的*/
            dl.digestCalculated(digest) ;
        }
        
    }

    
    
    
    @Override
    
public void run() {
        
// TODO Auto-generated method stub
        try {
            FileInputStream in 
= new FileInputStream(input) ;
            MessageDigest sha 
= MessageDigest.getInstance("SHA") ;
            DigestInputStream din 
= new DigestInputStream(in , sha) ;
            
int b ;
            
while((b = din.read()) != -1) ;
            din.close() ;
            
byte [] digest = sha.digest() ;
            
this.sendDigest(digest) ;                        
        }
 catch (FileNotFoundException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
 catch (NoSuchAlgorithmException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
 catch (IOException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
            
    }

    
      
}


   
 3 下面是一个主类 

     在主类中new 出来每一个线程对象,然后将自身添加到 线程对象的 容器中。
    
package cn.bupt.thread;

import java.io.File;

public class ListCallbackDigestUserInterface implements DigestListener{
   
    
private File input ;
    
private byte [] digest ;
    
    
public ListCallbackDigestUserInterface(File input){
        
        
this.input = input ;
    }

    
    
    
public void calculatedDigest(){
        
        ListCallbackDigest  cb 
= new ListCallbackDigest(input) ;
        cb.addDigestListener(
this) ;
        Thread t 
= new Thread(cb) ;
        t.start() ;
    }

    
    
    
    @Override
    
public void digestCalculated(byte[] digest) {
        
// TODO Auto-generated method stub
        this.digest = digest ;
        System.out.println(
this) ;
    }


    
    
public String toString() 
    
{
        String result 
= input.getName() + "" ;
        
if(digest != null)
        
{
          
for(int i = 0 ; i < digest.length ;i++){
              result 
+= digest[i] + "  " ;
            
          }

        }
else {
            
            result
+="digest not available" ;
        }

        
        
return result ;
    }

    
    
    
    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        
// TODO Auto-generated method stub

        
        
for(int i  = 0 ; i< args.length ; i++){
            
            File f 
= new File(args[i]) ;
            ListCallbackDigestUserInterface d 
=  new ListCallbackDigestUserInterface(f) ;
            d.calculatedDigest() ;
            
        }

    }


}


  


















posted on 2010-07-14 15:06 buptduming 阅读(254) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: