多线程下载网页中的图片

  1. 主线程
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=&copyright=&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();

		}
	}

}

  1. 子线程
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.欢迎指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值