package com.mogujie.tools; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import android.content.ContentResolver; import android.content.Context; import android.content.res.AssetManager; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Environment; /** * 文件缓存管理, * 包括sd 卡文件读写,和assets中的文件读写 * @author 6a209 * 下午12:05:32 2011-12-21 */ public class FileIOTools { private Context mCtx; private long mTimeDuration; private static FileIOTools sFileIOTools; public static final String BASE_PATH = Environment.getExternalStorageDirectory() + "/mogujie/"; /*日志 文件*/ public static final String DIR_LOG = BASE_PATH + "log/"; public static final String PICTURE_INDEX_DIR = BASE_PATH + "pic_index/"; public static final String PICTURE_WALL_DIR = BASE_PATH + "pic_wall/"; public static final String PICTURE_OTHRE_DIR = BASE_PATH + "pic_other/"; public static final String DEFAULT_WELCOME = "default_welcome"; private boolean isDeletingFiles =false; private FileIOTools(Context ctx){ mCtx = ctx.getApplicationContext(); } public static FileIOTools instance(Context ctx){ if(null == sFileIOTools){ sFileIOTools = new FileIOTools(ctx); } return sFileIOTools; } /** * 机身自带内存 * @param ctx * @param fileName * @return * @throws IOException */ public Bitmap readFile(Context ctx, String fileName) throws IOException{ Bitmap image = null; try { FileInputStream fis = ctx.openFileInput(fileName); image = BitmapFactory.decodeStream(fis); fis.close(); } catch (IOException e) { e.printStackTrace(); } return image; } public void writeBitmap2File( Context ctx, String file, Bitmap img, CompressFormat format) throws Exception{ if (img == null) { return; } if(null == format){ format = Bitmap.CompressFormat.JPEG; } FileOutputStream fo = ctx.openFileOutput(file, Context.MODE_PRIVATE); img.compress(format, 100, fo); fo.flush(); fo.close(); } /** * 从sd卡中读取数据 * @param dir 文件夹 * @param fileName 文件名 * @return 返回内容 * @throws Exception */ public String readSDFile(String dir, String fileName) throws Exception{ if(!hasSDCard()){ return null; } File targetFile = new File(dir, fileName); InputStream in; BufferedReader br; StringBuffer sb = new StringBuffer(); if(targetFile.exists()){ in = new BufferedInputStream(new FileInputStream(targetFile)); br = new BufferedReader(new InputStreamReader(in, "utf8")); String line; while ((line = br.readLine()) != null) { sb.append(line); } in.close(); br.close(); } return sb.toString(); } /** * 将文件写到sd卡中 * @param dir 写入的目录 * @param fileName 文件名 * @param data 要写的数据 * @throws Exception */ public void writeSDFile(String dir, String fileName, String data) throws Exception{ if(!hasSDCard()){ return; } File targetFile = new File(dir, "welcome"); OutputStreamWriter osw = null; if(!targetFile.exists()){ targetFile.createNewFile(); } osw = new OutputStreamWriter(new FileOutputStream(targetFile),"utf-8"); osw.write(data); osw.flush(); osw.close(); } /** * @param fileName * @return * @throws Exception */ public String readAssets(String fileName) throws Exception{ InputStream in; BufferedReader br; StringBuffer sb = new StringBuffer(); in = mCtx.getResources().getAssets().open(fileName); br = new BufferedReader(new InputStreamReader(in, "utf8")); String line; while ((line = br.readLine()) != null) { sb.append(line + "\n"); } in.close(); br.close(); return sb.toString(); } public Bitmap getImageFromAssetsFile(String fileName) { Bitmap image = null; AssetManager am = mCtx.getResources().getAssets(); try { InputStream is = am.open(fileName); image = BitmapFactory.decodeStream(is); is.close(); } catch (IOException e) { e.printStackTrace(); } return image; } /** * 从文件中取图 * @param context * @param dirFile * @param imgName md5之后的名字 * @return */ public Bitmap getBitmapFromSD(Context context, String dirFile, String imgName) { if(!hasSDCard()){ return null; } // MGUtils utils = MGUtils.instance(mCtx); if(null == imgName){ return null; } imgName = EncryptTools.instance().toMD5(imgName); File file = new File(dirFile, imgName); if(!file.exists()){ return null; } try { return BitmapFactory.decodeFile(dirFile + "/" + imgName); } catch (Throwable e) { ContentResolver resolver = context.getContentResolver(); BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = 2; o2.inPreferredConfig = Bitmap.Config.RGB_565; InputStream is; try { is = resolver.openInputStream(Uri.fromFile(file)); return BitmapFactory.decodeStream(is, null, o2); } catch (Throwable e1) { return null; } } } public Bitmap getTempBitmapFromSD(Context context) { if(!hasSDCard()){ return null; } File file = new File(PICTURE_OTHRE_DIR, "temp.jpg"); if(!file.exists()){ return null; } //获取缩放比例,长不超过800 BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inJustDecodeBounds = true; BitmapFactory.decodeFile(file.getPath(), o2); int s = o2.outWidth>o2.outHeight?o2.outWidth:o2.outHeight; int d= (int)Math.floor(s/800.0); d = d<1?1:d; o2.inSampleSize = d; o2.inPreferredConfig = Bitmap.Config.ARGB_8888; o2.inJustDecodeBounds = false; return BitmapFactory.decodeFile(PICTURE_OTHRE_DIR+"temp.jpg", o2); } public void writeBtimapToSD( Context ctx, String dir, String file, Bitmap img, CompressFormat format) throws Exception{ if(!hasSDCard()){ return; } if (img == null) { return; } String path = dir + EncryptTools.instance().toMD5(file); File targetFile = new File(path); if(targetFile.exists()){ return; } targetFile.createNewFile(); FileOutputStream fo = new FileOutputStream(path); img.compress(format, 100, fo); fo.flush(); fo.close(); } /** * 初始化sd卡中的文件 */ public void initDir(){ File wall = new File(PICTURE_WALL_DIR); if(!wall.exists()){ wall.mkdirs(); } File welcome = new File(PICTURE_INDEX_DIR); if(!welcome.exists()){ welcome.mkdirs(); } File other = new File(PICTURE_OTHRE_DIR); if(!other.exists()){ other.mkdirs(); } File log = new File(DIR_LOG); if(!log.exists()){ log.mkdirs(); } } // private ArrayList<String> mListFiles = new ArrayList<String>(); /** * 按天删除 * @param dir * @param count */ public void delFilesByTime(final String dir, final int days){ if(!hasSDCard()||isDeletingFiles){ return; } isDeletingFiles = true; mTimeDuration = 1000 * 60 * 60 * 24 * days; new Thread(){ @Override public void run(){ File file = new File(dir); File [] list = file.listFiles(new TimeFlitter()); if(null != list){ int max = Math.min(100, list.length); for(int i = 0; i < max; i++){ list[i].delete(); } } isDeletingFiles = false; } }.start(); } synchronized public void delFiles(){ if(!hasSDCard()||isDeletingFiles){ return; } isDeletingFiles = true; mTimeDuration = 1000 * 60 * 60 * 24 * 1; new Thread(){ @Override public void run(){ File file = new File(PICTURE_WALL_DIR); File [] list = file.listFiles(new TimeFlitter()); if(null != list){ for(int i = 0; i < list.length; i++){ list[i].delete(); } } file = new File(PICTURE_OTHRE_DIR); list = file.listFiles(new TimeFlitter()); if(null != list){ for(int i = 0; i < list.length; i++){ list[i].delete(); } } isDeletingFiles = false; } }.start(); } /** * 过滤出2天前的删 * @author 6a209 * 上午10:16:22 2012-1-12 */ private class TimeFlitter implements FileFilter{ @Override public boolean accept(File pathname) { long modified = pathname.lastModified(); long curTime = System.currentTimeMillis(); if(curTime - modified > mTimeDuration){ return true; } return false; } } /** * 判断sd卡是否存在 * @return */ public boolean hasSDCard(){ return Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED); } }