多线程下载器

转载 2012年03月25日 18:22:38

多线程下载器

?
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
package net;
 
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
 
public class DownMultiThreadFrame extends JFrame implements ActionListener{
    public DownMultiThreadFrame(){
        panel.setLayout(new FlowLayout());
        label1.setFont(new Font("雅黑", Font.BOLD, 15));
        panel.add(label1);
        panel.add(label2);
        panel.add(urlField);
        panel.add(StartButton);
        panel.add(resetButton);
        panel.add(exitButton);
        setContentPane(panel);
        StartButton.addActionListener(this);
        resetButton.addActionListener(this);
        exitButton.addActionListener(this);
        setSize(400, 400);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
 
    public static void main(String[] args){
        new DownMultiThreadFrame();
 
    }
 
    private final JPanel panel = new JPanel();
    private final JLabel label1 = new JLabel("网络资源的多线程下载:");
    private final JLabel label2 = new JLabel("网络资源的网址:");
    JButton StartButton = new JButton("点击开始下载");
    JButton resetButton = new JButton("清空");
    JButton exitButton = new JButton("退出");
    JTextField urlField = new JTextField(20);
 
    @Override
    public void actionPerformed(ActionEvent e){
        if(e.getSource() == StartButton){
            if("".equals(urlField.getText())){
                JOptionPane.showMessageDialog(this, "请输入资源地址");
            }
            String url = urlField.getText();
            int pos = url.lastIndexOf("/");
            String fileName = url.substring(pos + 1);
            try{
                download(url, "d:\\" + fileName, 2);
            }catch(Exception e1){
                e1.printStackTrace();
            }
        }else if(e.getSource() == resetButton){
            urlField.setText("");
        }else{
            System.exit(0);
        }
    }
 
    /**
     * 下载网络资源
     * */
    public void download(String url, String dest, int threadNum)
            throws Exception{
        URL downURL = new URL(url);
        // 打开网络连接
        HttpURLConnection conn = (HttpURLConnection) downURL.openConnection();
        // 创建文件长度的变量
        long fileLength = -1;
        // 获得连接状态标记代码
        int stateFlagCode = conn.getResponseCode();
        if(stateFlagCode == 200){
            // 网络连接正常
            fileLength = conn.getContentLength();
            // 取笑网络连接
            conn.disconnect();
        }
        if(fileLength > 0){
            // 计算每个线程的字节数
            long byteCounts = fileLength / threadNum + 1;
            File file = new File(dest);
            int i = 0;
            while(i < threadNum){
                long startPosition = byteCounts * i;
                long endPosition = byteCounts * (i + 1);
                if(i == threadNum - 1){
                    DownMulltiThread fileThread = new DownMulltiThread(url,
                            file, startPosition, 0);
                    new Thread(fileThread).start();
                }else{
                    DownMulltiThread fileThread = new DownMulltiThread(url,
                            file, startPosition, endPosition);
                    new Thread(fileThread).start();
                }
                i++;
            }
        }
    }
 
}// end class
 
/**
 * 用于实现网络资源的下载
 * */
class DownMulltiThread implements Runnable{
 
    public DownMulltiThread(){
 
    }
 
    /**
     * @param sUrl
     *            网络资源位置
     * @param desFile
     *            需要写入的文件对象
     * @param startPos
     *            写入的开始位置
     * @param endPos
     *            写入文件的结束位置
     * */
    public DownMulltiThread(String sUrl, File desFile, long startPos,
            long endPos){
        this.desFile = desFile;
        this.sUrl = sUrl;
        this.startPos = startPos;
        this.endPos = endPos;
    }
 
    private String sUrl = "";
    private File desFile;
    private long startPos;
    private long endPos;
 
    @Override
    public void run(){
        RandomAccessFile out;
        try{
            out = new RandomAccessFile(desFile, "rw");
            out.seek(startPos);
            URL url = new URL(sUrl);
            URLConnection urlcon = url.openConnection();
            urlcon.connect();
            InputStream in = urlcon.getInputStream();
            BufferedInputStream buf = new BufferedInputStream(in);
            byte[] bytes = new byte[1024];
            int len = buf.read(bytes);
            while(len != -1){
                out.write(bytes, 0, len);
                len = buf.read(bytes);
            }
 
        }catch(FileNotFoundException e){
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}

单线程下载和多线程下载

单线程下载1.单线程下载比较简单,就是开启一个线程,然后打开URL连接按照字节的方式读取流,写入文件就可了 2.用AsyncTask实现单线程下载class DownLoadSingle exten...
  • ForrestL
  • ForrestL
  • 2015年09月14日 21:54
  • 297

在Java中使用多线程结合断点续传实现一个简单的文件下载器

这篇博客介绍在android中使用多线程和断点续传实现一个简单的文件下载器 第一步:启动Tomcat服务器,将需要下载的文件部署到Tomcat服务器上 第二步:使用eclipse创建一个J...
  • u010105970
  • u010105970
  • 2016年04月23日 13:25
  • 1768

http协议多线程下载

#include #include #include #include #include #include #include #include #include /** *要实现多线程...
  • qq_35039122
  • qq_35039122
  • 2016年07月23日 16:15
  • 1362

仿迅雷实现下载工具,支持断点续传和多线程下载以及简单界面展示

这篇博客介绍一下在公司实习时选做的一个项目,虽然实习期间没有全部完成,但觉得这个项目做好的话挺有意思的,就在之后几天赶着完善了这个项目。这个项目是仿照迅雷,实现一个下载工具。 (开发平台: Ubun...
  • Chengzi_comm
  • Chengzi_comm
  • 2016年11月04日 18:58
  • 1919

Java代码实现多线程下载和断点续传

- 多线程下载原理 客户端要下载一个文件, 首先请求服务器,服务器将这个文件传送给客户端,客户端保存到本地, 完成了一个下载的过程. 多线程下载的思想是客户端开启多个线程同时下载,每个线程只负责下载文...
  • qq_32101859
  • qq_32101859
  • 2016年11月15日 21:10
  • 4680

多线程下载的原理

假如我们把一个服务器上的文件看作是一个水缸里的水的话,那么多线程下载就相当于从水缸上打了多个小孔,然后塞进去小管道进行抽水。呵呵,也许这个比喻不够准确。多线程下载大致可分为以下几个步骤: 一、首先在...
  • howlaa
  • howlaa
  • 2014年03月23日 17:42
  • 9040

Java之多线程下载工具类

1、多线程下载工具类import java.net.URL; import java.io.InputStream; import java.io.RandomAccessFile; import j...
  • a_1054280044
  • a_1054280044
  • 2017年03月15日 21:05
  • 595

多线程下载图片(使用ExecutorService)

从网络下载图片时,使用多线程同时下载,可以提高下载速度,带来更好的用户体验. 1. 下载图片的线程池管理类 /** * 下载图片的线程池管理 */ public class ThreadPoolM...
  • u012620150
  • u012620150
  • 2015年01月26日 11:48
  • 816

QT-多线程知识(例子:多线程下载小说)

一、新建一个线程类 继承QThread的一个线程类,实现run方法,同时要包含头文件 #include 获取当前的线程id currentThreadId() 线程睡眠(1秒) sleep(1...
  • wyansai
  • wyansai
  • 2016年10月23日 19:42
  • 803

基于HTTP的多线程文件下载功能实现

思想 文件信息获取的获取方式与单线程的方式一样 与单线程相比不同的是将远程文件分块并发获取,然后再并发写入到本地暂存文件中 远程文件分块的实现依据是:connection.setRequestProp...
  • WuZuoDingFeng
  • WuZuoDingFeng
  • 2016年12月08日 19:33
  • 574
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程下载器
举报原因:
原因补充:

(最多只允许输入30个字)