灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:9194回复:2

java实现多线程下载

楼主#
更多 发布于:2013-11-04 11:03

[code ]packagedonghongyujava.gui;

 importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;

importjava.io.File;importjava.io.InputStream;importjava.io.RandomAccessFile;

importjava.net.HttpURLConnection;importjava.net.URL;

importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;

importjavax.swing.JTextField;importjavax.swing.plaf.InsetsUIResource;

publicclassDownlodeJframe_v2 extendsJFrame {

    privateJLabel downlodeJlabel;

    privateJTextField downlodeJTextField;

    privateJButton downlodeJButton;

    publicDownlodeJframe_v2() {

        super("下载页面");

        this.setLayout(null);

        downlodeJlabel = newJLabel("下载连接:");

        downlodeJlabel.setBounds(20, 30, 80, 30);

 

        downlodeJTextField = newJTextField(

                "http://172.22.65.22:8080/day31/vedio/test.rmvb");

        downlodeJTextField.setBounds(90, 30, 350, 30);

 

        downlodeJButton = newJButton("立即下载");

        downlodeJButton.setMargin(newInsetsUIResource(0, 0, 0, 0));

        downlodeJButton.setBounds(200, 120, 100, 40);

         add(downlodeJlabel);

        add(downlodeJTextField);

        add(downlodeJButton);

        downlodeJButton.addActionListener(newMyActionListener());

         this.setSize(500, 300);

        this.setLocationRelativeTo(null);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.setVisible(true);

    }

    publicstaticvoidmain(String[] args) {

        newDownlodeJframe_v2();

    }     // 事件监听的内部类

    classMyActionListener implementsActionListener {

        // 声明随机访问的随机访问文件

        privateRandomAccessFile access;

         @Override

        publicvoidactionPerformed(ActionEvent e) {

            // TODO Auto-generated method stub

            // 设置按钮不可用

            downlodeJButton.setEnabled(false);

            // 获取下载链接

            finalString path = downlodeJTextField.getText();

            try{

                // 根据路径创建url对象的对象

                URL url = newURL(path);

                // HttpURLConnection支持 HTTP 特定功能的 URLConnection。

                /*

                 * 每个 HttpURLConnection 实例都可用于生成单个请求, 但是其他实例可以透明地共享连接到 HTTP

                 * 服务器的基础网络。 请求后在 HttpURLConnection 的 InputStream 或 OutputStream

                 * 上 调用 close() 方法可以释放与此实例关联的网络资源, 但对共享的持久连接没有任何影响。如果在调用

                 * disconnect() 时持久连接空闲,则可能关闭基础套接字。

                 */

                // 调用url中的openConnection(Proxy proxy)与 openConnection() 类似,

                // 所不同是连接通过指定的代理建立;不支持代理方式的协议处理程序将忽略该代理参数并建立正常的连接。

                HttpURLConnection httpURLConnection = (HttpURLConnection) url

                        .openConnection();

 

                // 获取目标资源的大小

                intsize = httpURLConnection.getContentLength();

                // 获取目标资源的名称并设置对应的保存名称

                // substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串

                // /该子字符串从指定索引处的字符开始,直到此字符串末尾。

                // lastIndexOf(String str) 返回指定子字符串在此字符串中最右边出现处的索引。

                File file = newFile("E:"

                        + path.substring(path.lastIndexOf("/")));

                // 根据文件的名称创建出RandomAccessFile此类的实例支持对随机访问文件的读取和写入。

                // RandomAccessFile(File file, String mode) 创建从中读取和向其中写入

                // (可选)的随机访问文件流,该文件由 File 参数指定。

                // mode取值:

                /*

                 * 值 含意

                 *

                 * "r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。 "rw"

                 * 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。 "rws" 打开以便读取和写入,对于

                 * "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。 "rwd" 打开以便读取和写入,对于

                 * "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。

                 */

 

                access = newRandomAccessFile(file, "rw");

                // 设置文件的大小

                access.setLength(size);

                // 关闭此随机访问文件流并释放与该流关联的所有系统资源。

                access.close();

                // 指示近期服务器不太可能有其他请求。

                httpURLConnection.disconnect();

 

                // 定义线程的数量

                intthreadNumber = 3;

                // 向创建出来的与目标文件大小及类型相同的文件中写入数据

                for(inti = 1; i <= threadNumber; i++) {

                    // 根据目标资源的总大小计算每条线程所需要分担的下载大小

                    intblockSize = size / threadNumber;

                    // 计算出每条线程的开始下载位置

                    finalintstartSize = (i - 1) * blockSize;

 

                    inttemp = i * blockSize - 1;

                    // 判断当前运行的线程是不是最后一条

                    if(i == threadNumber) {

                        if(temp < size) {

                            temp = size;

                        }

                    }

                    // 计算线程下载的结束位置

                    finalintendSize = temp;

 

                    // 创建线程内部的文件随机读取的对象

                    finalRandomAccessFile threadFile = newRandomAccessFile(file,

                            "rw");

 

                    // 创建线程

                    newThread() {

                        publicvoidrun() {

                            // 创建与资源文件的在一次连接

                            try{

                                // 根据目标资源的路径创建url对象

                                URL url = newURL(path);

                                // 打开链接

                                HttpURLConnection httpURLConnection = (HttpURLConnection) url

                                        .openConnection();

                                // 设置一般请求属性。

                                httpURLConnection.setRequestProperty("Range",

                                        "bytes="+ startSize + "-"+ endSize);

                                // 获取连接后的输入流对象

                                InputStream is = httpURLConnection

                                        .getInputStream();

                                // 设置文件开始写入的位置

                                threadFile.seek(startSize);

                                //缓冲区创建

                                bytebuffer[]=newbyte[1024];

                                //读取文件长度

                                intlen=0;

                                while((len=is.read(buffer))!=-1){

                                    threadFile.write(buffer, 0, len);

                                }

                                //释放资源

                                is.close();

                                threadFile.close();

                                httpURLConnection.disconnect();

                                                            

 

                            } catch(Exception e) {

                                // TODO Auto-generated catch block

                                e.printStackTrace();

                            }

 

                        }

                    }.start();

 

                }

 

            } catch(Exception e1) {

                // TODO Auto-generated catch block

                e1.printStackTrace();

            }

        }    }

}[/code]


喜欢0 评分0
java归来
新手上路
新手上路
  • 注册日期2014-01-19
  • 发帖数7
  • QQ45083359
  • 火币30枚
  • 粉丝0
  • 关注0
沙发#
发布于:2014-01-19 20:46
回复(0) 喜欢(0)     评分
eshiheike
新手上路
新手上路
  • 注册日期2010-11-24
  • 发帖数6
  • QQ
  • 火币27枚
  • 粉丝0
  • 关注0
板凳#
发布于:2014-03-16 17:03
收下研究去。谢谢!

回复(0) 喜欢(0)     评分
游客

返回顶部