A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 张向辉 于 2013-1-25 09:41 编辑

今天写了个java 单线程下载文件的GUI程序,效果图如下:
比如我想下载一个网页图片,输入图片地址,下载下来的图片打开什么都看不到,这是什么原因呢?
这是代码:
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileOutputStream;
import java.io.InputStream;
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 SingleThreadDownload extends JFrame implements ActionListener{
    public SingleThreadDownload(){
        panel.setLayout(new FlowLayout());
        label2.setFont(new Font("雅黑", Font.BOLD, 15));
        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, 150);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    //下载url资源
    public void download(String address) throws Exception{
        URL url = new URL(address);//
        URLConnection urlcon = url.openConnection();//打开连接
        urlcon.connect();//连接url资源
        InputStream in = urlcon.getInputStream();//从连接中获取输入流
        String filePath = url.getFile();//得到下载的文件路径
        int pos = filePath.lastIndexOf("/");
        String fileName = filePath.substring(pos + 1);//得到下载文件名
        FileOutputStream out = new FileOutputStream("D:\\" + fileName);//保存下载文件的路径
        byte[] bytes = new byte[1024];
        int len = in.read();
        while(len != -1){
            out.write(bytes, 0, len);//每次读取1024个字节数据写入输出流
            len = in.read();
        }
        out.close();//关闭输出流
        in.close();//关闭输入流
        JOptionPane.showMessageDialog(this, "下载完毕");
    }

    public static void main(String[] args){
        new SingleThreadDownload();
    }

    private final JPanel panel = new JPanel();
    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();
            try{
                download(url);
            }catch(Exception e1){
                JOptionPane.showMessageDialog(this, "资源地址有误,请检查,谢谢!");
                e1.printStackTrace();
            }
        }else if(e.getSource() == resetButton){
            urlField.setText("");
        }else{
            System.exit(0);
        }

    }

}

downloadfile.jpg (17.23 KB, 下载次数: 76)

java单线程下载文件

java单线程下载文件

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
byte[] bytes = new byte[1024];
        int len =0;
        while((len=in.read(bytes)) != -1){  //你原来的是int len = in.read();然后在循环,len=第一次读的1024字节数据,然后就没有了,所以你图片显示不出来
            out.write(bytes, 0, len);//每次读取1024个字节数据写入输出流
            len = in.read();
        }


评分

参与人数 2技术分 +1 黑马币 +9 收起 理由
Rancho_Gump + 1 赞一个!
yong230 + 9 赞一个!

查看全部评分

回复 使用道具 举报
用你的写法图片能出来了,但显示不全,下面有一部分没有图像。仔细看了看你的写法,发现这句是多余的:len = in.read();我去掉后后可以下载一个完整的图片了,还要谢谢楼上的回答
为什么这两种写法不等效?
byte[] bytes = new byte[1024];
        int len = in.read();
        while(len != -1){
            out.write(bytes, 0, len);//
            len = in.read();
        }


byte[] bytes = new byte[1024];
        int len =0;
        while((len=in.read(bytes)) != -1){  
            out.write(bytes, 0, len);//
        }
回复 使用道具 举报
yong230 发表于 2013-1-24 17:08
用你的写法图片能出来了,但显示不全,下面有一部分没有图像。仔细看了看你的写法,发现这句是多余的:len = i ...

没仔细看,while循环读了,在循环里就不用再read读取了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马