- 主线程
package com.etime;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test08 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
URL url = new URL(
"https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1606216525423_R&pv=&ic=&nc=1&z=&hd=&latest=©right=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&sid=&word=%E6%88%90%E9%83%BD");
InputStream openStream = url.openStream();
// 字节流转化成字符流
InputStreamReader inputStreamReader = new InputStreamReader(openStream);
StringBuffer buffer = new StringBuffer();
int len = 0;
char[] chars = new char[1024 * 1];
while ((len = inputStreamReader.read(chars)) != -1) {
// 将源代码存储到buffer中
buffer.append(chars, 0, len);
}
// 源码下载完成,关闭连接
inputStreamReader.close();
// 打印源码及相关信息
System.out.println(buffer);
System.out.println("======================");
System.out.println("长度" + buffer.length());
// 正则表达式删选出符合条件的网址
String regex = "https?://[\\w\\-\\./=&,]+?\\.(jpg|jpeg|png|gif)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(buffer);
int startNum = 0;
URL url2 = null;
// 多线程个数 限制为6个
int limitCount = 6;
// 暂存图片地址避免重复下载
String picbuf = "pic";
while (matcher.find(startNum)) {
String group = null;
// 匹配字符串
group = matcher.group();
// 图片地址相同不下载
if (picbuf.equals(group)) {
// 直接跳过不下载
} else {
picbuf = group;
System.out.println(group);
url2 = new URL(group);
Test03 te = new Test03(url2);
Thread thread = new Thread(te);
System.out.println("线程数" + Thread.activeCount() + "起始位置" + matcher.start());
while (Thread.activeCount() > limitCount) {
// 限制子线程个数
}
thread.start();
}
// 跳过此处图片地址 找下一个
startNum = matcher.end();
}
}
}
- 子线程
package com.etime;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class Test03 implements Runnable {
private URL url = null;
public Test03(URL url) {
super();
this.url = url;
}
@Override
public void run() {
// TODO Auto-generated method stub
Date date=new Date();
String str="ddHHmmssSS";//命名规则
SimpleDateFormat dateFormat=new SimpleDateFormat(str, Locale.getDefault());
String format = dateFormat.format(date);
String string =url.toString();
int lastIndexOf = string.lastIndexOf('.');
String substring = string.substring(lastIndexOf);//图片后缀
//System.out.println(substring);
InputStream openStream=null;
FileOutputStream fileOutputStream=null;
try {
openStream = url.openStream();
String name=format+substring;
File file=new File("f:"+File.separator+"picdownload"+File.separator+name);
fileOutputStream=new FileOutputStream(file);
byte[] bytes=new byte[1024*1];
int len=0;
while((len=openStream.read(bytes))!=-1) {
fileOutputStream.write(bytes, 0, len);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
openStream.close();
fileOutputStream.flush();
fileOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
p.s.欢迎指正