在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, "下载完成");
} }