先上图:

这一次没有采取正则匹配,而采取了最简单的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多线程超时加载当网页图片的更多相关文章

  1. Android 多线程 异步加载

    Android 应用中需要显示网络图片时,图片的加载过程较为耗时,因此加载过程使用线程池进行管理, 同时使用本地缓存保存图片(当来回滚动ListView时,调用缓存的图片),这样加载和显示图片较为友好 ...

  2. Scrapy爬取Ajax(异步加载)网页实例——简书付费连载

    这两天学习了Scrapy爬虫框架的基本使用,练习的例子爬取的都是传统的直接加载完网页的内容,就想试试爬取用Ajax技术加载的网页. 这里以简书里的优选连载网页为例分享一下我的爬取过程. 网址为: ht ...

  3. JAVA类的加载、连接与初始化

    JAVA类的加载.连接与初始化 类的声明周期总共分为5个步骤1.加载2.连接3.初始化4.使用5.卸载 当java程序需要某个类的时候,java虚拟机会确保这个类已经被加载.连接和初始化,而连接这个类 ...

  4. Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】

    Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)[系列1] Android在加载或者处理超大巨型图片 ...

  5. Qt(QtWebEngine)加载本地网页跨域问题的总结

    目录 1. 概述 2. 详论 2.1. 传参 2.2. JS module 3. 建议 4. 参考 1. 概述 浏览器直接加载本地网页的时候,如果网页涉及到加载本地资源(如图片),会出现跨域的问题.Q ...

  6. jvm系列(一):java类的加载机制

    java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...

  7. 关于android 加载https网页的问题

    我在加载https网页时出现空白, 因此,我就百度一下,可以发现: webView.setWebViewClient(new WebViewClient(){ @Override public voi ...

  8. 如何在启用SharePoint浏览器功能的InfoPath 表单中添加托管代码以动态地加载并显示图片

    InfoPath 的浏览器表单不支持加载并显示图片,当然在模板中可以插入图片,但是如果想显示数据库的一幅图片,或是动态加载一张图片就无能为力了. 基实这个问题可以通过在浏览器表单中使用: " ...

  9. Java中类的加载、连接和初始化

    Java中类的加载.连接和初始化 类的加载.连接和初始化 先介绍一下JVM和类 JVM和类: 当我们调用Java命令运行某个Java程序时,该命令将会启动一个Java虚拟机进程,不管该Java程序有多 ...

随机推荐

  1. window 配置wnmp(转下整理 ,全)

    工具/原料   RunHiddenConsole.exe 下载地址:http://pan.baidu.com/share/link?shareid=100074&uk=822373947 方法 ...

  2. apache 局域网访问

    很多的朋友都想把自己的电脑打造为服务器使别人能够访问.比如说你自己写了一网站,只能自己通过localhost访问或127.0.0.1访问.但是怎么让别人的电脑也能访问呢?来看看自己写的网站.现在我来讲 ...

  3. jxl读数据库数据生成xls 并下载

    1.所需jar jxl-2.6.10.jar jxls-core-1.0-RC-3.jar jxls-reader-1.0-RC-3.jar 2. excel修改行宽度封装 SheetColumn.j ...

  4. 有关uploadifive的使用经验

    这段时间做了一个项目用到uploadifive上传控件,和uploadify不同,这个控件是基于HTML5的版本而不用支持falsh,因而移动端也可以使用. 整理用过的相关属性与方法: 属性 作用 a ...

  5. 浏览器Range,Selection等选中文本对象

    Range对象 Range 对象表示文档的连续范围区域,如用户在浏览器窗口中用鼠标拖动选中的区域. 最常见的Range是用户文本选择范围(user text selection).当用户选择了页面上的 ...

  6. 微软亚洲实验室一篇超过人类识别率的论文:Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification ImageNet Classification

    在该文章的两大创新点:一个是PReLU,一个是权值初始化的方法.下面我们分别一一来看. PReLU(paramter ReLU) 所谓的PRelu,即在 ReLU激活函数的基础上加入了一个参数,看一个 ...

  7. 【Java】需要注意的小细节

    一.==和equals 1.比较两个变量时 a.==可以判断两个变量是否相等,如果两个变量是基本类型变量,而且是数值类型,只要两个变量值相等,返回true. 2.比较两个引用变量 a.==只有两个引用 ...

  8. fstream文件操作

    fstream(const char* filename, ios::openmode); ios::app: 以追加的方式打开文件 ios::ate: 文件打开后定位到文件尾,ios:app就包含有 ...

  9. jquery on 绑定多个事件 多个元素

    $('.wrap').on({ click:function(){ //事件1 ...... }, keyup:function() { //事件2 ....... }, keydown:functi ...

  10. Head First 设计模式-- 总结

    模式汇总:装饰者 :包装一个对象以得到新的行为状态   :封装了基于状态的行为,并使用委托在行为之间切换迭代器 :在对象的结合中游走,而不暴露集合的实现外观   :简化一群类的接口策略   :封装可以 ...