Android圖片本地緩存

Android 網絡圖片緩存到本地
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;
 }
 } 
}
}
發佈了58 篇原創文章 · 獲贊 4 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章