关于java的网图下载
我们在上篇文章中,学习到了用Thread类去创建多线程,我们本篇文章来向大家介绍一下网图下载功能,利用多线程同时下载多个图片😉
一、下载器
我们下载网络图片的时候,首先需要自己定义一个下载器,创建一个下载器的类,但是这里我们需要导入一个java包,可以用别人写好的方法直接应用。
-
commons.io.jar 针对开发IO流功能的工具类库。
-
下载地址:http://commons.apache.org/proper/commons-io/
-
下载好以后需要解压,解压后会看到以下内容。
- 复制图片中选中的包,然后在项目目录中新建一个lib软件包🤔,将conmmons包复制粘贴进去。
- 粘贴以后,可以看到还是压缩包形式的,我们右键点击lib,找到添加为库。
- 点击确认以后,发现刚刚复制的包可以展开了,这个时候就导入成功了。
- 我们创建一个新的类,然后在这个类里面再写一个下载器类。
package thread;
import org.apache.commons.io.FileUtils;//commons包
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class TestThread2 {
}
//下载器
class WebDownloader{
//下载方法
public void downloader(String url,String name)
{
try {
FileUtils.copyURLToFile(new URL(url),new File(name));//copyURLToFile复制连接转为文件,就是下载的方法
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常");
}
}
}
- 方法源码
public static void copyURLToFile(URL source, File destination) throws IOException {
Path path = destination.toPath();
PathUtils.createParentDirectories(path, new FileAttribute[0]);
Objects.requireNonNull(source);
PathUtils.copy(source::openStream, path, new CopyOption[]{StandardCopyOption.REPLACE_EXISTING});
}
二、实现下载
我们想用多线程去下载,同时下载多个图片,所以我们下面一步一步去实现。
1、继承Thread类,重写run方法
public class TestThread2 extends Thread {
@Override
public void run() {
super.run();
}
}
2、定义属性,url和name
public class TestThread2 extends Thread {
private String url;//图片地址
private String name;//保存名字
@Override
public void run() {
super.run();
}
}
3、构造函数
public class TestThread2 extends Thread {
private String url;
private String name;
public TestThread2(String url, String name) //ALT+INS
{
this.url = url;
this.name = name;
}
@Override
public void run() {
super.run();
}
}
4、线程体
public class TestThread2 extends Thread {
private String url;
private String name;
public TestThread2(String url, String name) {
this.url = url;
this.name = name;
}
@Override
public void run() {
WebDownloader webDownloader = new WebDownloader();
webDownloader.downloader(url,name);
System.out.println("下载了文件名为:"+name);
}
}
class WebDownloader{
//下载方法
public void downloader(String url,String name)
{
try {
FileUtils.copyURLToFile(new URL(url),new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常");
}
}
}
5、启动线程
package thread;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class TestThread2 extends Thread {
private String url;
private String name;
public TestThread2(String url, String name) {
this.url = url;
this.name = name;
}
//下载图片线程执行体
@Override
public void run() {
WebDownloader webDownloader = new WebDownloader();
webDownloader.downloader(url,name);
System.out.println("下载了文件名为:"+name);
}
public static void main(String[] args) {
TestThread2 t1 = new TestThread2("https://img.alicdn.com/imgextra/i3/95764894/O1CN01QztdCZ1m1VDPQnle3_!!0-saturn_solar.jpg_468x468q75.jpg_.webp","1.jpg");//打开网页按F12,可以查看路径
TestThread2 t2 = new TestThread2("https://img.alicdn.com/imgextra/i3/95764894/O1CN01QztdCZ1m1VDPQnle3_!!0-saturn_solar.jpg_468x468q75.jpg_.webp","2.jpg");
t1.start();
t2.start();
}
}
//下载器
class WebDownloader{
//下载方法
public void downloader(String url,String name)
{
try {
FileUtils.copyURLToFile(new URL(url),new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常");
}
}
}
6、跑起来!
下载了文件名为:2.jpg
下载了文件名为:1.jpg
进程已结束,退出代码为 0
我们可以看到,是先下载的2,后下载的1,下载好的图片就在项目中了。