JAVA多线程超时加载当网页图片
先上图:

这一次没有采取正则匹配,而采取了最简单的java分割和替代方法进行筛选图片

它能够筛选如下的图片并保存到指定的文件夹
如:
“http://xxxx/xxxx/xxx.jpg”
'http://xxxx/xxxx/xxx.jpg'
如果中间的分隔符为\/而不是/,可进行替换
如将http:\/\/xxxxx\/xxx\/xxx.jpg替换为http://xxxxx/xxx/xxx.jpg
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID; /***
* java抓取网络图片
*
* @author ITWANG
*
*/
public class CatchImage
{ // 抓去网页地址
private static final String URL = "http://image.baidu.com/channel?c=%E7%BE%8E%E5%A5%B3&t=%E5%B0%8F%E6%B8%85%E6%96%B0&s=0";
// 转换编码
private static final String ECODING = "UTF-8";
// 图片后缀
private static final String[] picstuffix = { "jpg", "JPG", "gif", "GIF", "png", "PNG" };
// 开启线程数
private static int Threadcount = 3;
// 超时时间
private static int timeout = 4000; public static void main(String[] args) throws Exception
{
CatchImage cm = new CatchImage();
// 获得html文本内容
String HTML = cm.getHTML(URL);
List<String> imgSrc = cm.getttr(HTML, picstuffix);
List<String> pList = cm.picFilter(imgSrc);
cm.TOThreadDownload(pList, "E:\\Imagesave" + saveDiff(), Threadcount, timeout);
} /**
* 过滤http:\/\/xxxxxx\/xxxx\/xxx.jpg为http://xxxxxx/xxxx/xxx.jpg
* @param picurl 图片列表
* @return 返回过滤后的图片列表
*/
public List<String> picFilter(List<String> picurl)
{
List<String> list = new ArrayList<>();
for (String string : picurl)
{
list.add(string.replace("\\/", "/"));
}
return list;
} /**
* 获取但网页图片
*
* @param htmlsource
* html的string数据源
* @param picstuffix
* 后缀数组
* @return 返回图片地址
*/
public List<String> getttr(String htmlsource, String[] picstuffix)
{
List<String> listpic = new ArrayList<>();
String[] htmlarray1 = htmlsource.split("\"");
String[] htmlarray2 = htmlsource.split("\'");
System.out.println("双引号分割:"+htmlarray1.length);
for (int i = 0; i < htmlarray1.length; i++)
{
for (int j = 0; j < picstuffix.length; j++)
{
if (htmlarray1[i].startsWith("http") && htmlarray1[i].endsWith(picstuffix[j]))
{
listpic.add(htmlarray1[i]);
}
}
}
System.out.println("单引号分割:"+htmlarray2.length);
for (int i = 0; i < htmlarray2.length; i++)
{
for (int j = 0; j < picstuffix.length; j++)
{
if (htmlarray2[i].startsWith("http") && htmlarray2[i].endsWith(picstuffix[j]))
{
listpic.add(htmlarray2[i]);
}
}
}
System.out.println(listpic.size());
for (String string : listpic)
{
System.out.println(string);
}
return listpic;
} /***
* 获取HTML内容,并且转为String
*
* @param url
* 网页地址
* @return 返回字符串
* @throws Exception
* 连接网络失败
*/
private String getHTML(String url) throws Exception
{
URL uri = new URL(url);
URLConnection connection = uri.openConnection();
InputStream in = connection.getInputStream();
byte[] buf = new byte[1024];
int length = 0;
StringBuffer sb = new StringBuffer();
while ((length = in.read(buf, 0, buf.length)) > 0)
{
sb.append(new String(buf, ECODING));
}
in.close();
return sb.toString();
} /**
* 多线程超时下载
*
* @param listImgSrc
* 图片地址列表
* @param savedir
* 保存文件夹
* @param tnum
* 开启线程数
* @param timeout
* 下载超时时间
*/
private void TOThreadDownload(List<String> listImgSrc, String savedir, int tnum, int timeout)
{
for (int i = 0; i < listImgSrc.size(); i += tnum)
{
new TODThread(savedir, tnum, listImgSrc, i, timeout).start();
}
} /**
*
* 2014-4-3上午10:52:07 Describe: 超时方式下载照片线程
*
* @author: ITWANG
*/
class TODThread extends Thread
{
private String savedir = null;
private int tnum;
private List<String> listImgSrc;
private int bunm;
private int timeout = 3000; public TODThread(String savedir, int tnum, List<String> listImgSrc, int bnum, int timeout)
{
this.savedir = savedir;
this.tnum = tnum;
this.listImgSrc = listImgSrc;
this.bunm = bnum;
this.timeout = timeout;
} @Override
public void run()
{
for (int i = 0; i < tnum; i++)
{
String url = listImgSrc.get(bunm + i);
String sps = url.substring(url.lastIndexOf("."), url.length());
String imageName = UUID.randomUUID().toString() + sps;
try
{
if (getPic(url, savedir, imageName, timeout))
{
System.out.println("*^_^*");
} else
{
System.out.println("-_-!");
}
} catch (Exception e)
{
System.out.println("下载异常:" + e);
}
}
}
} /**
* GET方式下载照片
*
* @param purl
* 图片路径
* @param folder
* 保存文件夹
* @param filename
* 保存文件名
* @param timeout
* 超时时间
* @return 返回保存状态
* @throws Exception
*/
public boolean getPic(String purl, String folder, String filename, int timeout) throws Exception
{
URL url = new URL(purl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(timeout);
conn.setRequestMethod("GET");
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30");
conn.setDoOutput(true);
conn.setDoInput(true);
if (conn.getResponseCode() == 200)
{
InputStream is = conn.getInputStream();
byte[] bs = new byte[1024];
int len;
File sf = new File(folder);
if (!sf.exists())
{
sf.mkdirs();
}
OutputStream os = new FileOutputStream(sf.getPath() + "\\" + filename);
while ((len = is.read(bs)) != -1)
{
os.write(bs, 0, len);
}
os.close();
is.close();
System.out.println("成功:" + url);
return true;
}
System.out.println("失败:" + url);
return false;
} /**
* 时间文件夹
*
* @return 返回当前时间
*/
public static String saveDiff()
{
SimpleDateFormat formate = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
return "\\" + formate.format(System.currentTimeMillis()) + "\\";
} }
JAVA多线程超时加载当网页图片的更多相关文章
- Android 多线程 异步加载
Android 应用中需要显示网络图片时,图片的加载过程较为耗时,因此加载过程使用线程池进行管理, 同时使用本地缓存保存图片(当来回滚动ListView时,调用缓存的图片),这样加载和显示图片较为友好 ...
- Scrapy爬取Ajax(异步加载)网页实例——简书付费连载
这两天学习了Scrapy爬虫框架的基本使用,练习的例子爬取的都是传统的直接加载完网页的内容,就想试试爬取用Ajax技术加载的网页. 这里以简书里的优选连载网页为例分享一下我的爬取过程. 网址为: ht ...
- JAVA类的加载、连接与初始化
JAVA类的加载.连接与初始化 类的声明周期总共分为5个步骤1.加载2.连接3.初始化4.使用5.卸载 当java程序需要某个类的时候,java虚拟机会确保这个类已经被加载.连接和初始化,而连接这个类 ...
- Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】
Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)[系列1] Android在加载或者处理超大巨型图片 ...
- Qt(QtWebEngine)加载本地网页跨域问题的总结
目录 1. 概述 2. 详论 2.1. 传参 2.2. JS module 3. 建议 4. 参考 1. 概述 浏览器直接加载本地网页的时候,如果网页涉及到加载本地资源(如图片),会出现跨域的问题.Q ...
- jvm系列(一):java类的加载机制
java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...
- 关于android 加载https网页的问题
我在加载https网页时出现空白, 因此,我就百度一下,可以发现: webView.setWebViewClient(new WebViewClient(){ @Override public voi ...
- 如何在启用SharePoint浏览器功能的InfoPath 表单中添加托管代码以动态地加载并显示图片
InfoPath 的浏览器表单不支持加载并显示图片,当然在模板中可以插入图片,但是如果想显示数据库的一幅图片,或是动态加载一张图片就无能为力了. 基实这个问题可以通过在浏览器表单中使用: " ...
- Java中类的加载、连接和初始化
Java中类的加载.连接和初始化 类的加载.连接和初始化 先介绍一下JVM和类 JVM和类: 当我们调用Java命令运行某个Java程序时,该命令将会启动一个Java虚拟机进程,不管该Java程序有多 ...
随机推荐
- Openfire on Centos7
学习一下linux,装备 1)centos 最小安装.(找抽的节奏) 2)必备 oepnssh yum install openssh-server.x86_64 3)配置网络.打开 /etc/sys ...
- newInstance()和new()
在Java开发特别是数据库开发中,经常会用到Class.forName( )这个方法.通过查询Java Documentation我们会发现使用Class.forName( )静态方法的目的是为了动态 ...
- 【转】linux中do{...} while(0)的解释
在看ldlm的代码过程中遇到了一个很奇怪的问题,有很多宏定义使用了do while(0)这种看起来好像没啥用的代码.然后我就问问师兄,才得知,这种用法很常见,自己又查了一下资料,原来在linux内核代 ...
- File API 读取上传的文件
1, 在html 文档中,<input type="file"> 我们可以选择文件进行上传,但这时只能上传一个文件.如果加上multiple 属性,可以上传多个文件,上 ...
- AES,RSA对称加密和非对称加密
1.关于RSA加密机制:是非对称加密方式,两个钥,公钥和私钥,公钥用于加密数据,可以分享给其他用户,私钥可以用于解密用公钥加密的数据,关于安全问题是公钥泄露不会影响安全问题,公钥与私钥是一一对应的关系 ...
- 如何解决子元素设了margin-top之后父元素所受的影响
解决方法: 1.在父元素上加:overflow:hidden. 2.给父元素加border; 3.外容器上加上padding.
- 获取sql server数据库表结构
if exists (select 1 from sysobjects where name = 'sysproperties'and xtype = 'V')begin DROP VIEW s ...
- Ajax回调函数返回的中文字符串乱码问题
通过ajax提交请求,返回的response所带的中文字符串一直显示为乱码,写了如下代码也无效: response.setCharacterEncoding("UTF-8"); r ...
- 【转】[特征选择] An Introduction to Feature Selection 翻译
中文原文链接:http://www.cnblogs.com/AHappyCat/p/5318042.html 英文原文链接: An Introduction to Feature Selection ...
- 【Yeoman】热部署web前端开发环境
本文来自 “简时空”:<[Yeoman]热部署web前端开发环境>(自动同步导入到博客园) 1.序言 记得去年的暑假看RequireJS的时候,曾少不更事般地惊为前端利器,写了<Sp ...