java 实现自定义事件

复制代码
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.EventListener;
import java.util.List;

public class Test {
    
    public static void main(String[] args) 
    {
        Test.FileDownloader fd = new FileDownloader("http://download.microsoft.com/download/e/c/9/ec94a5d4-d0cf-4484-8b7a-21802f497309/Vs6sp6.exe" 
                , "f:\\Vs6sp6.exe");
        
        fd.addDownloadListener(new DownloadListener() {
            @Override
            public void DownloadProgress(int totalLength ,int bytesCompleted) {
                System.out.println("订阅者1进度,已下载:" + bytesCompleted + "字节");
            } 
        });
        
        fd.addDownloadListener(new DownloadListener() {
            @Override
            public void DownloadProgress(int totalLength ,int bytesCompleted) {
                double percent = (double)bytesCompleted*100/(double)totalLength;
                DecimalFormat df = new java.text.DecimalFormat("#.00");  
                System.out.println("订阅者2进度,已下载:" + df.format(percent) + "%");
            } 
        });
        
        fd.download();
        System.out.println("任务下载完成!");
    }

    public static class FileDownloader implements DownloadListener
    {
        private List<DownloadListener> downloadListeners = new ArrayList<DownloadListener>();
        
        private String URL = null;
        private String savePath = null;
        
        public FileDownloader(String url, String savePath)
        {
            this.URL = url;
            this.savePath = savePath;
        }
        
        @SuppressWarnings("resource")
        public boolean download()
        {
            int bytesum = 0;
            int byteread = 0;

            URL url;
            try {
                url = new URL(this.URL);
            } catch (MalformedURLException e1) {
                e1.printStackTrace();
                return false;
            }

            try {
                URLConnection conn = url.openConnection();
                int totalLength = conn.getContentLength();
                InputStream inStream = conn.getInputStream();
                FileOutputStream fs = new FileOutputStream(this.savePath);

                byte[] buffer = new byte[1204];
                while ((byteread = inStream.read(buffer)) != -1) {
                    bytesum += byteread;
                    fs.write(buffer, 0, byteread);
                    DownloadProgress(totalLength ,bytesum);
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                return false;
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            } catch (Exception e){
                e.printStackTrace();
                return false;
            }
            
            return true;
        }

        @Override
        public void DownloadProgress(int totalLength ,int bytesCompleted) {
            for(DownloadListener listener : downloadListeners){
                listener.DownloadProgress(totalLength ,bytesCompleted);
            }
        }
        
        public void addDownloadListener(DownloadListener listener)
        {
            downloadListeners.add(listener);
        }
    }
    
    public interface DownloadListener extends EventListener 
    {
        public void DownloadProgress(int totalLength ,int bytesCompleted);
    }

    
}
复制代码

 

posted on   空明流光  阅读(426)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示