import java.io.File;import java.io.FileNotFoundException;
import java.io.FileOutputStream;import java.io.IOException;
import java.io.OutputStream;import java.util.Arrays;
import java.util.Comparator;import android.graphics.Bitmap;
import android.graphics.BitmapFactory;import android.os.Environment;
import android.os.StatFs;import android.util.Log;
public class ImageFileCache {
private static final String CACHDIR = "ImgCach";
private static final String WHOLESALE_CONV = ".cach";
private static final int MB = 1024*1024; private static final int CACHE_SIZE = 10;
private static final int FREE_SD_SPACE_NEEDED_TO_CACHE = 10; public ImageFileCache() {
//清理文件緩存
removeCache(getDirectory());
}
/** 從緩存中獲取圖片 **/
public Bitmap getImage(final String url) {
final String path = getDirectory() + "/" + convertUrlToFileName(url);
Log.i("ImageFileCache", path);
File file = new File(path);
if (file.exists()) {
Bitmap bmp = BitmapFactory.decodeFile(path);
if (bmp == null) { file.delete();
}
else {
updateFileTime(path); return bmp;
}
} return null;
}
/** 將圖片存入文件緩存 **/
public void saveBitmap(Bitmap bm, String url) {
if (bm == null) {
return;
}
//判斷sdcard上的空間
if (FREE_SD_SPACE_NEEDED_TO_CACHE > freeSpaceOnSd()) {
//SD空間不足 return;
}
String filename = convertUrlToFileName(url);
String dir = getDirectory();
File dirFile = new File(dir);
if (!dirFile.exists())
dirFile.mkdirs();
//dirFile.delete();
File file = new File(dir +"/" + filename);
try {
file.createNewFile();
OutputStream outStream = new FileOutputStream(file);
bm.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
outStream.flush(); outStream.close();
} catch (FileNotFoundException e) {
Log.w("ImageFileCache", "FileNotFoundException");
} catch (IOException e) {
Log.w("ImageFileCache", "IOException");
}
}
/** * 計算存儲目錄下的文件大小, * 當文件總大小大於規定的CACHE_SIZE或者sdcard剩餘空間小於FREE_SD_SPACE_NEEDED_TO_CACHE的規定 * 那麼刪除40%最近沒有被使用的文件 */
private boolean removeCache(String dirPath) {
File dir = new File(dirPath);
File[] files = dir.listFiles();
if (files == null) {
return true;
}
if (!android.os.Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED))
{
return false;
}
int dirSize = 0;
for (int i = 0; i < files.length; i++) {
if (files[i].getName().contains(WHOLESALE_CONV)) {
dirSize += files[i].length();
}
}
if (dirSize > CACHE_SIZE * MB || FREE_SD_SPACE_NEEDED_TO_CACHE > freeSpaceOnSd()) {
int removeFactor = (int) ((0.4 * files.length) + 1);
Arrays.sort(files, new FileLastModifSort());
for (int i = 0; i < removeFactor; i++) {
if (files[i].getName().contains(WHOLESALE_CONV)) {
System.out.println("deleted..."+files[i].getName());
}
}
}
if (freeSpaceOnSd() <= CACHE_SIZE) {
return false;
}
Log.i("ImageFileCache", "file.size = "+files.length);
return true;
}
/** 修改文件的最後修改時間 **/
public void updateFileTime(String path) {
File file = new File(path);
long newModifiedTime = System.currentTimeMillis();
file.setLastModified(newModifiedTime);
}
/** 計算sdcard上的剩餘空間 **/
private int freeSpaceOnSd() {
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
double sdFreeMB = ((double)stat.getAvailableBlocks() * (double) stat.getBlockSize()) / MB;
return (int) sdFreeMB;
}
/** 將url轉成文件名 **/
private String convertUrlToFileName(String url) {
String[] strs = url.split("/");
return strs[strs.length - 1] + WHOLESALE_CONV; }
/** 獲得緩存目錄 **/
private String getDirectory() {
String dir = getSDPath() + "/" + CACHDIR; return dir;
}
/** 取SD卡路徑 **/
private String getSDPath() {
File sdDir = null;
boolean sdCardExist = Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED);
//判斷sd卡是否存在
if (sdCardExist) {
sdDir = Environment.getExternalStorageDirectory();
//獲取根目錄
}
if (sdDir != null) {
return sdDir.toString();
}
else {
return ""; } }
/** * 根據文件的最後修改時間進行排序 */
private class FileLastModifSort implements Comparator {
public int compare(File arg0, File arg1) {
if (arg0.lastModified() > arg1.lastModified()) {
return 1;
} else if (arg0.lastModified() == arg1.lastModified()) {
return 0;
} else {
return -1;
}
}
}
}