android文件缓存管理
缓存类 :
public class ConfigCache {
private static final String TAG = ConfigCache.class.getName();
public static final int CONFIG_CACHE_MOBILE_TIMEOUT = 3600000; //1 hour
public static final int CONFIG_CACHE_WIFI_TIMEOUT = 300000; //5 minute
public static String getUrlCache(String url) {
if (url == null) {
return null;
}
String result = null;
File file = new File(AppApplication.mSdcardDataDir + "/" + getCacheDecodeString(url));
if (file.exists() && file.isFile()) {
long expiredTime = System.currentTimeMillis() - file.lastModified();
Log.d(TAG, file.getAbsolutePath() + " expiredTime:" + expiredTime/60000 + "min");
//1. in case the system time is incorrect (the time is turn back long ago)
//2. when the network is invalid, you can only read the cache
if (AppApplication.mNetWorkState != NetworkUtils.NETWORN_NONE && expiredTime < 0) {
return null;
}
if(AppApplication.mNetWorkState == NetworkUtils.NETWORN_WIFI
&& expiredTime > CONFIG_CACHE_WIFI_TIMEOUT) {
return null;
} else if (AppApplication.mNetWorkState == NetworkUtils.NETWORN_MOBILE
&& expiredTime > CONFIG_CACHE_MOBILE_TIMEOUT) {
return null;
}
try {
result = FileUtils.readTextFile(file);
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
public static void setUrlCache(String data, String url) {
File file = new File(AppApplication.mSdcardDataDir + "/" + getCacheDecodeString(url));
try {
//创建缓存数据到磁盘,就是创建文件
FileUtils.writeTextFile(file, data);
} catch (IOException e) {
Log.d(TAG, "write " + file.getAbsolutePath() + " data failed!");
e.printStackTrace();
}
}
public static String getCacheDecodeString(String url) {
//1. 处理特殊字符
//2. 去除后缀名带来的文件浏览器的视图凌乱(特别是图片更需要如此类似处理,否则有的手机打开图库,全是我们的缓存图片)
if (url != null) {
return url.replaceAll("[.:/,%?&=]", "+").replaceAll("[+]+", "+");
}
return null;
}
}
用法 :
void getConfig(){
//首先尝试读取缓存
String cacheConfigString = ConfigCache.getUrlCache(CONFIG_URL);
//根据结果判定是读取缓存,还是重新读取
if (cacheConfigString != null) {
// showConfig(cacheConfigString); //后面可以是UI更新,仅供参考
} else {
//如果缓存结果是空,说明需要重新加载
//缓存为空的原因可能是1.无缓存;2. 缓存过期;3.读取缓存出错
AsyncHttpClient client = new AsyncHttpClient();
client.get(CONFIG_URL, new AsyncHttpResponseHandler(){
@Override
public void onSuccess(String result){
//成功下载,则保存到本地作为后面缓存文件
ConfigCache.setUrlCache(result, CONFIG_URL);
//后面可以是UI更新,仅供参考
// showConfig(result);
}
@Override
public void onFailure(Throwable arg0) {
//根据失败原因,考虑是显示加载失败,还是再读取缓存
}
});
}
}
相关的工具类 :
/**
* 文件处理工具类
*
* @author naibo-liao
* @时间: 2013-1-4下午03:13:08
*/
public class FileUtils { public static final long B = 1;
public static final long KB = B * 1024;
public static final long MB = KB * 1024;
public static final long GB = MB * 1024;
private static final int BUFFER = 8192;
/**
* 格式化文件大小<b> 带有单位
*
* @param size
* @return
*/
public static String formatFileSize(long size) {
StringBuilder sb = new StringBuilder();
String u = null;
double tmpSize = 0;
if (size < KB) {
sb.append(size).append("B");
return sb.toString();
} else if (size < MB) {
tmpSize = getSize(size, KB);
u = "KB";
} else if (size < GB) {
tmpSize = getSize(size, MB);
u = "MB";
} else {
tmpSize = getSize(size, GB);
u = "GB";
}
return sb.append(twodot(tmpSize)).append(u).toString();
} /**
* 保留两位小数
*
* @param d
* @return
*/
public static String twodot(double d) {
return String.format("%.2f", d);
} public static double getSize(long size, long u) {
return (double) size / (double) u;
} /**
* sd卡挂载且可用
*
* @return
*/
public static boolean isSdCardMounted() {
return android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED);
} /**
* 递归创建文件目录
*
* @param path
* */
public static void CreateDir(String path) {
if (!isSdCardMounted())
return;
File file = new File(path);
if (!file.exists()) {
try {
file.mkdirs();
} catch (Exception e) {
Log.e("hulutan", "error on creat dirs:" + e.getStackTrace());
}
}
} /**
* 读取文件
*
* @param file
* @return
* @throws IOException
*/
public static String readTextFile(File file) throws IOException {
String text = null;
InputStream is = null;
try {
is = new FileInputStream(file);
text = readTextInputStream(is);;
} finally {
if (is != null) {
is.close();
}
}
return text;
} /**
* 从流中读取文件
*
* @param is
* @return
* @throws IOException
*/
public static String readTextInputStream(InputStream is) throws IOException {
StringBuffer strbuffer = new StringBuffer();
String line;
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(is));
while ((line = reader.readLine()) != null) {
strbuffer.append(line).append("\r\n");
}
} finally {
if (reader != null) {
reader.close();
}
}
return strbuffer.toString();
} /**
* 将文本内容写入文件
*
* @param file
* @param str
* @throws IOException
*/
public static void writeTextFile(File file, String str) throws IOException {
DataOutputStream out = null;
try {
out = new DataOutputStream(new FileOutputStream(file));
out.write(str.getBytes());
} finally {
if (out != null) {
out.close();
}
}
} /**
* 将Bitmap保存本地JPG图片
* @param url
* @return
* @throws IOException
*/
public static String saveBitmap2File(String url) throws IOException { BufferedInputStream inBuff = null;
BufferedOutputStream outBuff = null; SimpleDateFormat sf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
String timeStamp = sf.format(new Date());
File targetFile = new File(Constants.ENVIROMENT_DIR_SAVE, timeStamp
+ ".jpg");
File oldfile = ImageLoader.getInstance().getDiscCache().get(url);
try { inBuff = new BufferedInputStream(new FileInputStream(oldfile));
outBuff = new BufferedOutputStream(new FileOutputStream(targetFile));
byte[] buffer = new byte[BUFFER];
int length;
while ((length = inBuff.read(buffer)) != -1) {
outBuff.write(buffer, 0, length);
}
outBuff.flush();
return targetFile.getPath();
} catch (Exception e) { } finally {
if (inBuff != null) {
inBuff.close();
}
if (outBuff != null) {
outBuff.close();
}
}
return targetFile.getPath();
} /**
* 读取表情配置文件
*
* @param context
* @return
*/
public static List<String> getEmojiFile(Context context) {
try {
List<String> list = new ArrayList<String>();
InputStream in = context.getResources().getAssets().open("emoji");// 文件名字为rose.txt
BufferedReader br = new BufferedReader(new InputStreamReader(in,
"UTF-8"));
String str = null;
while ((str = br.readLine()) != null) {
list.add(str);
} return list;
} catch (IOException e) {
e.printStackTrace();
}
return null;
} /**
* 获取一个文件夹大小
*
* @param f
* @return
* @throws Exception
*/
public static long getFileSize(File f) {
long size = 0;
File flist[] = f.listFiles();
for (int i = 0; i < flist.length; i++) {
if (flist.isDirectory()) {
size = size + getFileSize(flist);
} else {
size = size + flist.length();
}
}
return size;
} /**
* 删除文件
*
* @param file
*/
public static void deleteFile(File file) { if (file.exists()) { // 判断文件是否存在
if (file.isFile()) { // 判断是否是文件
file.delete(); // delete()方法 你应该知道 是删除的意思;
} else if (file.isDirectory()) { // 否则如果它是一个目录
File files[] = file.listFiles(); // 声明目录下所有的文件 files[];
for (int i = 0; i < files.length; i++) { // 遍历目录下所有的文件
deleteFile(files); // 把每个文件 用这个方法进行迭代
}
}
file.delete();
}
}
}
android文件缓存管理的更多相关文章
- android文件缓存,并SD卡创建目录未能解决和bitmap内存溢出解决
1.相关代码: 加入权限: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ...
- [Android]异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3574131.html 这个可以实现ImageView异步加载 ...
- (转)Android技术积累:图片缓存管理
如果每次加载同一张图片都要从网络获取,那代价实在太大了.所以同一张图片只要从网络获取一次就够了,然后在本地缓存起来,之后加载同一张图片时就从缓存中加载就可以了.从内存缓存读取图片是最快的,但是因为内存 ...
- 分享个 之前写好的 android 文件流缓存类,专门处理 ArrayList、bean。
转载麻烦声明出处:http://www.cnblogs.com/linguanh/ 目录: 1,前序 2,作用 3,特点 4,代码 1,前序 在开发过程中,client 和 server 数据交流一 ...
- app缓存设计-文件缓存
采用缓存,可以进一步大大缓解数据交互的压力,又能提供一定的离线浏览.下边我简略列举一下缓存管理的适用环境: 1. 提供网络服务的应用 2. 数据更新不需要实时更新,哪怕是3-5分钟的延迟也是可以采用缓 ...
- 如何高效使用和管理Bitmap--图片缓存管理模块的设计与实现
转载请注明 ☞ http://blog.csdn.net/leverage_1229 上周为360全景项目引入了图片缓存模块.因为是在Android4.0平台以上运作,出于惯性,都会在设计之前查阅相关 ...
- [置顶] 如何高效使用和管理Bitmap--图片缓存管理模块的设计与实现
传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 上周为360全景项目引入了图片缓存模块.因为是在Android4.0平台以上运作,出于 ...
- 转 如何高效使用和管理Bitmap--图片缓存管理模块的设计与实现
上周为360全景项目引入了图片缓存模块.因为是在Android4.0平台以上运作,出于惯性,都会在设计之前查阅相关资料,尽量避免拿一些以前2.3平台积累的经验来进行类比处理.开发文档中有一个 Bitm ...
- Android离线缓存
android做到一定程度,需要考虑缓存的问题,不信可以掏出手机看看淘宝等一些app是否无网的情况下还可以浏览,不过大部分app并没有考虑到这些问题,解决Android的缓存有哪些方法呢 1.IO流读 ...
随机推荐
- Spring使用proxool连接池 管理数据源
一.Proxool连接池简介及其配置属性概述 Proxool是一种Java数据库连接池技术.是sourceforge下的一个开源项目,这个项目提供一个健壮.易用的连接池,最为关键的是这个连接池提供监控 ...
- 解析Ceph: 恢复与数据一致性
转自:https://www.ustack.com/blog/ceph-internal-recovery-and-consistency/ 作为一个面向大规模的分布式存储系统,故障处理是作为一个常态 ...
- orale存储技术
一.存储的主要作用 1.海量存储 阵列存储 光盘存储 磁带存储 数据迁移 文件服务器,跨平台文件共享 2.容灾 数据备份及恢复:磁带.光盘.阵列 数据复制:本地镜像.远程镜像 3.高 ...
- Spring_总结_01_Spring概述
一.前言 从今天开始,重新总结一下Spring的相关知识,主要是结合<Spring实战(第四版)>和 <JavaEE开发的颠覆者——SpringBoot实战>这两本书以及官方文 ...
- MBA 工商管理课程-风险型决策方法
(二)风险型决策方法 适用的条件 未来情况不止一种,管理者不知道到底哪种情况会发生,但知道每种情况发生的概率 常用方法: ...
- I.MX6 Android 5.1 回到 Android 4.2 emmc 启动
/*************************************************************************** * I.MX6 Android 5.1 回到 ...
- unity编译android包时提示android sdk路径有问题
如果你有洁癖喜欢把各种软件各种IDE都更新到最新,那么就恭喜你也会遇到我的问题: 重装了公司的imac,下载了最新的android sdk,uinty各种编译失败,真是耽误时间,其实不是android ...
- Jenkins之构建触发器配置(转载)
构建触发器配置,当你在文本框中输入配置的时间后,文本框下方会有时间解释,这样可以很好的看到自己配置的时间对不对. 可以清晰看到我的配置第一个运行时间是周五上午10点执行,第二次是星期六上午10点. ...
- unity shader 内置变量
官网Manual:http://docs.unity3d.com/Manual/SL-UnityShaderVariables.html unity提供大量的内置变量,来供我们使用,主要包括一些 :矩 ...
- IntellJ IDEA快捷键汇总
今天开始使用IDEA,各种不习惯,一会Eclipse一会IDEA来回切换,需要一个熟悉的过程,记录一下常用的快捷键. IDEA常用快捷键 Alt+回车 导入包,自动修正Ctrl+N 查找类Ctrl+ ...