package com.aiyou.utils.filecache;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import com.aiyou.utils.logcat.Logcat;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.os.StatFs;
import android.util.Base64;
public class FileManager {
private static final String TAG = FileManager.class.getSimpleName();
/**
* 文件过期时间为3天
*/
private static final long FILE_EXPIRE_TIME = 3 * 24 * 60 * 60 * 1000;
/**
* SD卡保存目录
*/
private static final String ROOTDIR = "/AiYou/";
// 图片存储地址
public static final String DIR_LARGEIMG = ROOTDIR + "LargeImg";
// 拍照
public static final String DIR_CAMERA = ROOTDIR + "CameraImg";
// 截屏
public static final String DIR_SNAPSHOT = ROOTDIR + "ScreenSnapshot";
// 文件存储地址
public static final String DIR_FILE = ROOTDIR + "Files";
// SmartImageView、CircleImageView缓存图像存储地址
public static final String DIR_IMG = ROOTDIR + "CacheImg";
// 文件名后缀
private static final String FILESUFFIX = ".gif";
// 图片格式
public static final CompressFormat BMP_FORMAT = CompressFormat.PNG;
public static final String BMP_SUFFIX = ".png";
public static final int BMP_QUALITY = 80;
// 缓存空间大小,单位MB
private static final int FREE_SD_SPACE_NEEDED_TO_CACHE = 50;
// SD卡是否挂载
private static boolean mSDMounted = false;
private String mDirPath;
public FileManager(String dir) {
mDirPath = getDirectory(dir);
if (mDirPath != null) {
File file = new File(mDirPath);
if (!file.exists()) {
// 若不存在,创建目录
file.mkdirs();
}
}
}
/**
* 从SD卡读取图片
*
* @param url 图片的网络地址,用于提取图片名称
* @return 读取成功则返回图片,否则返回null
*/
public byte[] getImage(final String url) {
String dir = mDirPath;
if (dir == null) {
return null;
}
final String path = dir + "/" + convertUrlToFileName(url);
File file = new File(path);
if (file.exists()) {
byte[] data = readFileByBytes(path);
if (data == null) {
file.delete();
} else {
updateFileTime(path);
}
return data;
}
return null;
}
/**
* 保存图片到SD卡
*
* @param url 图片的网络地址,用于提取图片名称
* @return 保存成功返回true,否则false
*/
public boolean saveWebBmpToSd(byte[] buffer, String url) {
return saveBytesToSd(buffer, mDirPath, convertUrlToFileName(url));
}
private boolean saveBytesToSd(byte[] buffer, String dir, String fileName) {
if (buffer == null) {
return false;
}
if (!isSDSpaceEnough()) {
return false;
}
if (dir == null) {
return false;
}
File file = new File(dir);
if (!file.exists()) {
file.mkdirs();
}
file = new File(dir + "/" + fileName);
if (file.exists()) {
file.delete();
}
OutputStream os = null;
try {
file.createNewFile();
os = new FileOutputStream(file);
os.write(buffer, 0, buffer.length);
os.flush();
return true;
} catch (FileNotFoundException e) {
Logcat.e(TAG, "saveBmpToSd FileNotFoundException");
return false;
} catch (IOException e) {
Logcat.e(TAG, "saveBmpToSd IOException");
return false;
} finally {
close(os);
}
}
public static boolean saveBmpToSd(Bitmap bmp, String dir, String fileName) {
if (bmp == null) {
return false;
}
if (!checkSDCard()) {
return false;
}
if (dir == null) {
return false;
}
File file = new File(dir);
if (!file.exists()) {
file.mkdirs();
}
file = new File(dir + "/" + fileName);
if (file.exists()) {
file.delete();
}
OutputStream os = null;
try {
file.createNewFile();
os = new FileOutputStream(file);
bmp.compress(BMP_FORMAT, BMP_QUALITY, os);
os.flush();
return true;
} catch (FileNotFoundException e) {
Logcat.e(TAG, "saveBmpToSd FileNotFoundException");
return false;
} catch (IOException e) {
Logcat.e(TAG, "saveBmpToSd IOException");
return false;
} finally {
close(os);
}
}
public static void saveTxt(String data, String name) {
FileOutputStream outStream = null;
OutputStreamWriter writer = null;
String fileName = getDirectory("/") + name + ".txt";
File file = new File(fileName);
if (file.exists()) {
file.delete();
}
try {
file.createNewFile();
outStream = new FileOutputStream(file);
writer = new OutputStreamWriter(outStream, "gb2312");
writer.write(data);
writer.write("\n");
writer.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
close(outStream);
}
}
/**
* 以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。
*/
public static byte[] readFileByBytes(String fileName) {
InputStream in = null;
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
in = new FileInputStream(fileName);
byte[] buf = new byte[1024];
int length;
while ((length = in.read(buf)) != -1) {
out.write(buf, 0, length);
}
} catch (IOException e) {
e.printStackTrace();
} catch (OutOfMemoryError e) {
e.printStackTrace();
close(out);
out = null;
} finally {
close(out);
close(in);
}
if (out == null) {
return null;
}
return out.toByteArray();
}
/**
* 将url转成文件名
*
* @param url
* @return
*/
public static String convertUrlToFileName(String url) {
// 判断是否是论坛图片
if (url.endsWith("middle") || url.endsWith("small")) {
url = url.substring(0, url.lastIndexOf('/'));
}
String fileName;
String arr[] = getFileNameFromUrl(url).split("\\.");
fileName = arr[0] + FILESUFFIX;
return fileName;
}
/**
* 删除过期文件
*
* @param dirPath
* @return 清理的文件个数,-1为找不到路径
*/
public static int removeExpiredCache(String dirPath) {
int count = 0;
String path = getDirectory(dirPath);
if (path == null) {
return -1;
}
File dir = new File(path);
File[] files = dir.listFiles();
if (files != null && files.length > 0) {
long time = System.currentTimeMillis();
for (File file : files) {
if (time - file.lastModified() > FILE_EXPIRE_TIME) {
file.delete();
count++;
Logcat.i(TAG, "清理过期文件:" + file.getAbsolutePath());
}
}
Logcat.i(TAG, "共清理过期文件:" + count);
}
return count;
}
/**
* 修改文件的最后修改时间 这里需要考虑,是否将使用的图片日期改为当前日期
*
* @param path
*/
public static void updateFileTime(String path) {
File file = new File(path);
long newModifiedTime = System.currentTimeMillis();
file.setLastModified(newModifiedTime);
}
/**
* 获取路径
*
* @param dirName {@link #DIR_CAMERA}or{@link #DIR_FILE}or{@link #DIR_IMG}or
* {@link #DIR_IMG}or{@link #DIR_LARGEIMG}or{@link #DIR_SNAPSHOT}
* @return
*/
public static String getDirectory(String dirName) {
String dir = null;
if (isSDMounted() && dirName != null) {
dir = Environment.getExternalStorageDirectory()
.getAbsolutePath() + dirName;// 获取根目录
}
return dir;
}
/**
* 检查SD卡是否可用,该函数需启动时调用
*
*/
public static boolean checkSDCard() {
return !(!isSDMounted() || !isSDSpaceEnough());
}
/**
* 判断SD卡是否挂载
*
* @return
*/
private static boolean isSDMounted() {
if (!mSDMounted) {
mSDMounted = Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED);
}
return mSDMounted;
}
/**
* 判断SD卡是否空间充足
*/
private static boolean isSDSpaceEnough() {
StatFs stat = new StatFs(Environment.getExternalStorageDirectory()
.getPath());
@SuppressWarnings("deprecation")
double sdFreeMB = ((double) stat.getAvailableBlocks() * (double) stat
.getBlockSize()) / 1024 / 1024;
return sdFreeMB > FREE_SD_SPACE_NEEDED_TO_CACHE;
}
public static void close(OutputStream stream) {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
Logcat.e(TAG, "close IOException");
}
}
}
public static void close(InputStream stream) {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
Logcat.e(TAG, "close IOException");
}
}
}
/**
* 检查是否是图像文件
*
* @param fileName
* @return
*/
@SuppressLint("DefaultLocale")
public static boolean isImage(String fileName) {
fileName = fileName.toLowerCase();
return fileName.endsWith("jpg") || fileName.endsWith("jpeg")
|| fileName.endsWith("png") || fileName.endsWith("gif")
|| fileName.endsWith("bmp");
}
/**
* 检查是否是mp3文件
*
* @param fileName
* @return
*/
@SuppressLint("DefaultLocale")
public static boolean isMp3(String fileName) {
fileName = fileName.toLowerCase();
return fileName.endsWith("mp3");
}
/**
* 将图片的URL转换为图片名称
*
* @param url
* @return
*/
public static String getFileNameFromUrl(String url) {
String bmpName = null;
if (url != null) {
bmpName = Base64.encodeToString(url.getBytes(), Base64.NO_PADDING | Base64.NO_WRAP)
+ BMP_SUFFIX;
}
return bmpName;
}
/**
* 从Assets中读取表情图片
*/
public static Bitmap getImageFromAssetsFile(String fileName, Context context) {
Bitmap image = null;
AssetManager am = context.getResources().getAssets();
try {
InputStream is = am.open("face/" + fileName);
image = BitmapFactory.decodeStream(is);
is.close();
} catch (IOException e) {
Logcat.e(TAG, "getFaceFromAssetsFile IOException");
}
return image;
}
}