关于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 {@Overridepublic void run() {super.run();}
}
2、定义属性,url和name
public class TestThread2 extends Thread {private String url;//图片地址private String name;//保存名字@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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;}//下载图片线程执行体@Overridepublic 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,下载好的图片就在项目中了。