Swing程序实现网络资源下载

5 篇文章 0 订阅
4 篇文章 0 订阅

在Java网络编程中,资源下载是必不可少的一部分,如何使用代码从网络上下载你需要的网络资源。在Java中可以使用HttpURLConnection类来实现。

网络资源单线程下载

创建窗体关键代码:创建一个类,继承JFrame(窗体类),在该类的构造方法设置窗体内容(如窗体大小、将控件添加到容器中以及设置控件的位置等等),其中使用addActionListener监听按钮以进行相对应的响应。但点击下载按钮时获取输入地址的文本框内容,将该输入的地址作为参数调用编写好的下载文件方法。关键代码如下

private JTextField jf_text;//单行文本域

public DownloadResources() {

super();

        //设置布局为空

        getContentPane().setLayout(null);

        setTitle("网络资源单线程下载");//设置标题

        setBounds(0, 0, 500, 200);

        //设置窗体默认关闭方式

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

       //省略添加设置控件的部分代码

        final JButton button = new JButton();

        //注册监听器以监听事件源产生的事件 通过ActionListener响应用户点击按钮

        button.addActionListener(new ActionListener() {//下载按钮

            public void actionPerformed(final ActionEvent e) {

                String address = jf_text.getText().trim();// 获得网址

                download(address);  //调用下载文件方法

            }

        });

        final JButton button_1 = new JButton();//清空按钮

        //注册监听器

        button_1.addActionListener(new ActionListener() {

            public void actionPerformed(final ActionEvent e) {

            jf_text.setText(null);// 清除内容

            jf_text.requestFocus();// 使文本框获得焦点

            }

        });

下载文件方法:将传过来的地址作为参数创建URL对象,通过URL对象获取连接对象从而打开资源连接通信获取该输入流,而文件名通过路径进行截取获取,创建文件输出流对象进行输出文件,最后弹出信息框。

public void download(String urlAdd){

        try {

            URL url = new URL(urlAdd);    // 创建URL对象

            URLConnection urlConnection = url.openConnection(); //获得连接对象

            urlConnection.connect();// 打开到url引用资源的通信链接

            InputStream in = urlConnection.getInputStream() ; //获得输入流对象

            String filePath = url.getFile();// 获得完整路径

// 获得路径中最后一个斜杠的位置

            int index = filePath.lastIndexOf("/"); 

            String fileName = filePath.substring(index+1); // 截取文件名

// 创建输出流对象

            FileOutputStream out = new FileOutputStream("D:/is/"+fileName);              byte[] bytes = new byte[1024]; // 声明存放下载内容的字节数组

            int count = in.read(bytes);  // 从输入流中读取内容

            while (count != -1){

                out.write(bytes,0,count);  // 将读取的内容写到输出流

                count = in.read(bytes); // 继续从输入流中读取内容

            }

            // 关闭输出、输入流

            out.close();        

            in.close();         

            JOptionPane.showMessageDialog(null, "下载完成");//弹出对话框

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

main主方法:在主线程实例化当前类,设置窗体可见。

public static void main(String args[]) {

        EventQueue.invokeLater(new Runnable() {

            public void run() {

                try {

                DownloadResources frame = new DownloadResources();

                    // 省略了获取当前屏幕大小设置窗体居中部分代码

                     //设置窗体可见

                    frame.setVisible(true);

                } catch (Exception e) {

                    e.printStackTrace();

                }

            }

        });

    }

效果

多线程下载方法 关键代码 通过创建线程类,在下载时指定线程数,使用RandomAccessFile类的seek()方法定位下一个写入点,再通过write()方法写入文件。

public void download(String url, String dest, int threadNum) throws Exception{

        URL downURL = new URL(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);// 创建目标文件的File对象

            int i = 0;

            while (i < threadNum) {

                long startPosition = byteCounts * i;// 定义开始位置

                long endPosition = byteCounts * (i + 1);// 定义结束位置

                if (i == threadNum - 1) {

                    DownMultiThread fileThread = new DownMultiThread(url, file,

                            startPosition, 0);// 创建DownMultiThread线程的实例

                    new Thread(fileThread).start();// 启动线程对象

                } else {

                    DownMultiThread fileThread = new DownMultiThread(url, file,

                    startPosition, endPosition);//创建DownMultiThread线程的实例

                    new Thread(fileThread).start();// 启动线程对象

                }

                i++;

            }

            JOptionPane.showMessageDialog(null, "下载完成");

        }   }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值