即时的网上抓图,尽管可以保证图片是最新的,但是遇上网络环境差的地方,load图的过程就会令人抓狂!假设图片的更新是有周期的,隔一段时间,图片才会换掉,那么为本地的程序弄一个本地的缓存,来提升加载图片的效率,这就变得十分有必要!
之前由于客户需求,搞了一个自动下载并自动更新本地图片的类,现在拿出来与大家分享:
具体的思路是:先初始化网络图片的URL,以及本地缓存的URL,本地缓存用大时间作为分类条件,方便日后程序对过期的图片缓存进行删除。然后,开一任务线程把图片下载到本地,当外部程序炫耀加载网络图片时,先去读取本地的缓存,若本地已存在改图片,则直接加载本地的缓存,否则再去请求网络图片。此外还有一过期图片自动删除的任务线程,在类初始化时,就已经启动,专门负责把存在已超过一定时间的图片整批地删除。
package com.godlsien.ebon.business.ebon;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;
/**
* 本地图片缓存管理类
* @author zhiweiofli
*
*/
public class ImageManager {
public static String CACHE_URI = "";
private Timer timer = null;
private static ImageManager tpim = null;
/**
* 构造方法
* @param url
*/
private ImageManager(String url){
CACHE_URI = url;
if(timer!=null){
timer.cancel();
timer = null;
}
timer = new Timer();
timer.schedule(new DeleCacheTask(), 0, 86400000); //每隔一天,执行一次删除图片的任务
mkdir(url);
}
/**
*
* @param url 本地缓存路径
* @return
*/
public static ImageManager getIntance(String url){
if(tpim==null){
tpim = new ImageManager(url);
}
return tpim;
}
/**
*
* @return null if CACHE_URI is null
*/
public static ImageManager getIntance(){
if(tpim==null){
if(CACHE_URI!=""){
tpim = new ImageManager(CACHE_URI);
} else {
tpim = null;
}
}
return tpim;
}
/**
* 创建本地缓存的方法
* @param url 图片的网络路径
*/
public void createCache(String url){
timer.schedule(new CreateCacheTask(url), 5000); //5秒后,开始下载图片
}
/**
* 下载图片并生成图片缓存
* @param imgUrl 图片的网络路径
* @param fileURL 图片的本地路径
*/
public void downloadCreateImg(String imgUrl,String fileURL) {
try {
// 创建流
BufferedInputStream in = new BufferedInputStream(new URL(imgUrl)
.openStream());
String imgName = getFileName(imgUrl);
System.out.println("download img name:" + imgName);
String folder = fileURL.substring(0, fileURL.lastIndexOf("/")+1);
System.out.println("floder path:" + folder);
mkdir(folder);
// 存放地址
fileURL+=imgName;
System.out.println("save img path:" + fileURL);
File img = new File(fileURL);
if(!img.exists()){
// 生成图片
BufferedOutputStream out = new BufferedOutputStream(
new FileOutputStream(img));
byte[] buf = new byte[2048];
int length = in.read(buf);
while (length != -1) {
out.write(buf, 0, length);
length = in.read(buf);
}
out.close();
} else {
System.out.println("umage cache file exited");
}
in.close();
System.out.println("image cache save complete");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 用于创建文件夹的方法
* @param mkdirName
*/
public void mkdir(String path){
try{
File dirFile = new File(path);
boolean bFile = dirFile.exists();
if(bFile == true){
System.out.println("The folder exists.");
}else{
System.out.println("The folder do not exist,now trying to create a one...");
bFile = dirFile.mkdir();
if(bFile == true){
System.out.println("Create successfully!");
}else{
System.out.println("Disable to make the folder,please check the disk is full or not.");
System.exit(1);
}
}
}catch(Exception err){
System.err.println("ELS - Chart : 文件夹创建发生异常");
err.printStackTrace();
}
}
/**
* 获取网络图片的文件名
* @param url
* @return ImgName
*/
public String getFileName(String url){
int index = url.lastIndexOf("/");
return url.substring(index+1, url.length());
}
/***
* 判断文件夹是或否过期的方法
* @param filePath 文件夹路径
* @return
*/
public boolean isOutDate(String filePath){
Calendar cal = Calendar.getInstance();
int index = filePath.indexOf(CACHE_URI)+CACHE_URI.length()+1;
System.out.println("the index of last / :" + index);
String fileName = filePath.substring(index, filePath.length());
System.out.println("dele folder name:" + fileName);
String[] ss = fileName.split("-");
int year = Integer.parseInt(ss[0]);
int month = Integer.parseInt(ss[1]);
if(year <= cal.get(Calendar.YEAR)){
if(month < (cal.get(Calendar.MONTH)+1)){
return true;
} else {
return false;
}
} else {
return false;
}
}
public String getCurrentMonth(){
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM");
return sdf.format(new java.util.Date());
}
/**
* 创建本地缓存的任务
* @author zhiweiofli
*
*/
class CreateCacheTask extends TimerTask{
private String path = "";
CreateCacheTask(String url){
path = url;
}
@Override
public void run() {
String date=getCurrentMonth();
String fileUrl = CACHE_URI+date+"/";
downloadCreateImg(path, fileUrl);
}
}
/**
* 周期删除本地缓存的时间任务
* @author zhiweiofli
*
*/
class DeleCacheTask extends TimerTask{
@Override
public void run() {
System.out.println(new java.util.Date() + "删除任务开始执行!");
File file = new File(CACHE_URI);
File[] files = file.listFiles();
if(files!=null){
for(File f:files){
if(f.isDirectory()){
String fPath = f.getPath();
System.out.println("dele path:"+fPath);
if(isOutDate(fPath)){
if(f.delete()){
System.out.println(new java.util.Date() + "删除成功!");
} else {
System.out.println(new java.util.Date() + "删除失败!");
}
}
}
}
}
System.out.println(new java.util.Date() + "删除任务完成!");
}
}
}
分享到:
相关推荐
通过VBA,你可以设置定时任务定期检查并更新图片。首先,打开VBA编辑器(按下Alt + F11),创建一个新的模块,然后添加以下代码: ```vba Sub UpdatePictures() Dim sh As Worksheet For Each sh In ...
这通常包括获取当前显示的图片索引,计算下一个要显示的图片索引,然后更新ImageView的图片资源。如果设置有循环播放,当到达最后一张图片时,应重置回第一张。 4. **动画效果**:为了提升用户体验,可以在切换图片...
在IT行业中,开发软件时确保程序能够自动更新是一项重要的任务,因为它可以帮助用户轻松获取软件的最新功能和安全修复。在Delphi编程环境中,有多种方法可以实现程序的自动更新,其中一个便是通过使用特定的更新控件...
可以使用Handler和Runnable来实现定时任务,或者使用Timer和TimerTask类。例如,使用Handler的postDelayed方法可以设置延迟执行的任务: ```java Handler handler = new Handler(); handler.postDelayed(new ...
【标题】"自动发说说自动换图片"指的是利用编程技术实现的一种自动化功能,它能够定期或按照预设条件在社交平台,如QQ空间上自动发布状态更新,并且每次发布时自动更换配图。这样的应用通常用于个人或者企业账号的...
"SD 使用的 模型信息自动更新插件"是一种针对Stablediffusion软件的辅助工具,旨在提升用户在处理模型信息时的效率和便捷性。该插件的主要功能是自动扫描并同步SD模型的相关数据,包括但不限于模型参数、模型结构...
为了实现自动切换图片,我们通常会结合使用Handler、Runnable和Thread,或者是使用Android提供的Animator类或者ViewFlipper组件。 1. Handler-Runnable机制: 创建一个Runnable对象,在run()方法中改变ImageView的...
当`Timer`触发时,`Handler`会发送一个消息到消息队列,然后`Handler`的`handleMessage()`方法会被调用,从而更新`ViewPager`的当前页,实现图片的自动切换。 实现这一功能的具体步骤可能包括以下几个部分: 1. ...
VBA是Microsoft Office套件中的内置编程语言,允许用户自定义工作流程,自动化重复任务。在Excel或WPS中,我们可以通过VBA编写宏来执行特定操作,比如自动插入图片。 **宏的创建与运行** 1. **创建宏**: 在Excel或...
"壁纸自动更新"是一款针对Android平台的软件应用,旨在为用户提供个性化的壁纸更换服务,让用户能够根据自己的喜好和兴趣自动更换手机桌面背景。这款服务不仅增加了手机使用的趣味性,也充分体现了Android系统的开放...
在C#编程环境中,实现一个图片自动播放的功能是一项常见的任务,尤其在开发多媒体应用程序或桌面小工具时。这个功能允许用户选择一个包含多张图片的文件夹,然后程序会按照顺序逐一显示这些图片,同时提供播放、暂停...
在C#编程环境中,开发一个图片浏览自动播放的应用是一个常见的任务,尤其对于图像处理或多媒体应用来说。这个项目中,开发者使用了ListView控件来实现这一功能。ListView控件是Windows Forms中的一个强大组件,它...
定时任务可以设定在特定时间执行脚本,自动从指定的数据源抓取新电影信息,而异步处理则可以在后台不干扰用户浏览的情况下进行数据更新。此外,源码可能还集成了API接口,与各大电影数据库(如IMDb或豆瓣电影)进行...
在JavaScript中实现图片自动切换是一项常见的前端开发任务,主要用于创建动态、吸引人的用户界面,例如轮播图或幻灯片展示。以下将详细介绍如何利用JavaScript实现这一功能。 首先,我们需要理解基本的HTML结构,...
本项目的核心在于监控指定的图片目录,当有新图片添加或更新时,自动将其设置为桌面背景。Delphi中可以使用TDirectory和TFile类来监控文件系统的变化,同时利用System.Win.ComObj单元中的Wallpaper属性改变桌面壁纸...
在IT领域,开发一个图片浏览器是一项常见的任务,尤其对于初学者来说,这能帮助他们更好地理解和运用编程语言。本项目是用Java实现的图片浏览器,它具有自动播放图片的功能,给人一种观看动画片的体验。接下来,我们...
在JavaScript中实现图片自动旋转是一项常见的任务,尤其在动态展示或者动画效果中。这个功能的实现主要涉及到HTML、CSS和JavaScript三者的结合。下面将详细解释如何使用JavaScript来完成图片的自动旋转。 首先,...
本软件能批量处理本地图片,具有范围裁剪、自动去除黑边、调整大小、压缩体积等功能。 通过范围裁剪和去黑边两种功能配合,可以绕过图片边缘的干扰色块,提取图片中部的所需内容。一键去除黑边打开主程序,将任意 ...
在IT行业中,图片处理是一项常见的任务,特别是在图形设计、数据分析和多媒体应用中。本文将深入讲解如何使用C#编程语言实现一个批量自动去除图片白边的程序,这可以帮助用户节省大量手动裁剪的时间,提高效率。 ...
本项目是关于利用 jQuery 实现一个图片自动切换的功能,结合淡入淡出效果,同时具备左右按钮和分页索引控制,提升用户体验。以下将详细介绍这个项目的实现原理和相关知识点。 首先,我们要理解 jQuery 的基本用法。...