package com.xnx3.spider.cache; import java.io.IOException; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import com.xnx3.BaseVO; import com.xnx3.DateUtil; import com.xnx3.file.FileUtil; import com.xnx3.spider.Global; import com.xnx3.spider.vo.ResourceVO; /** * 缓存队列,缓存相关操作 * @author 管雷鸣 */ public class Cache { /** * 当前缓存的资源。key:resourceBean.netUrl * <br/>可以通过传入资源的绝对路径,来判断此资源是否缓存过。无论是待缓存,还是已缓存完毕,都会在这里有 * <br/>同时,在项目打开时,也会从本地读取已缓存的资源列表,将其缓存到此map */ public static Map<String, Resource> cacheMap = new HashMap<String, Resource>(); /** * 将资源加入缓存序列。 * @param rb 要加入的资源 * @return {@link ResourceBean} * <ul> * <li>若加入成功。等待进行缓存,则此处会返回null</li> * <li>若加入失败,因为之前已经缓存过了。也就是已经有当前的缓存文件了。那么将缓存文件中的 {@link ResourceBean}返回 </li> * </ul> */ public static synchronized ResourceVO addCache(Resource resource){ ResourceVO vo = new ResourceVO(); if(resource.getNetUrl() == null){ //无远程资源,退出不缓存 vo.setResult(BaseVO.FAILURE); return vo; } if(resource.getNetUrl().length() > 255){ //远程资源可能不是一个正常的url,可能是图片的base64存在,退出不缓存。因为本身就跟随其父文件进行了缓存了 vo.setResult(BaseVO.FAILURE); return vo; } //找cacheMap中是否缓存了 Resource cacheResource = cacheMap.get(resource.getNetUrl()); if(cacheResource == null){ cacheResource = cacheMap.get(resource.getOriginalUrl()); if(cacheResource != null){ System.out.println("cacheResource-->"+cacheResource); } } //如果缓存中有,那么要将之前的缓存返回 if(cacheResource != null){ //已经缓存过了,不用再进行缓存 vo.setResource(cacheResource); }else{ //如果缓存中没有,那么进行缓存,将其下载下来 downFile(resource); //将绝对路径其加入缓存 cacheMap.put(resource.getNetUrl(), resource); //将其原始引用路径加入缓存 cacheMap.put(resource.getOriginalUrl(), resource); vo.setResource(resource); } return vo; } /** * 将 {@link #cacheMap} 缓存到本地磁盘,文件下载 */ public static synchronized void downFile(Resource resource){ try { FileUtil.downFiles(resource.getNetUrl(), resource.getLocalUrl()); }catch(java.io.FileNotFoundException notFind){ Global.log("404 File Not Found ! "+resource.getNetUrl()); }catch(java.lang.NullPointerException nullE){ Global.log("downFile NULL----- "+resource.getNetUrl()); }catch (Exception e) { Global.log(e.getMessage()+" --- "+resource.getNetUrl()); e.printStackTrace(); } } public static void main(String[] args) throws IOException { FileUtil.downFiles("http://www.xingyucjb.com/Public/Wap/images/b4.png", "/images/js/b4.png"); } }