/**
* 对文件处理的工具类
*/
public class FileUtils {
/**
* 获取可以使用的缓存目录(默认目录名/itlanbaoApp/)
* @param context
* @return
*/
public static File getDiskCacheDir(Context context) {
return getDiskCacheDir(context, FileConstants.RESOURCE_DIRECTORY);
}
/**
* 获取可以使用的缓存目录
* @param context
* @param uniqueName 目录名称
* @return
*/
public static File getDiskCacheDir(Context context, String uniqueName) {
final String cachePath = checkSDCard() ? getExternalCacheDir(context).getPath() : getAppCacheDir(context);
File cacheDirFile = new File(cachePath);
if (!cacheDirFile.exists()) {
cacheDirFile.mkdirs();
}
return cacheDirFile;
}
/**
* 获取程序外部的缓存目录
* @param context
* @return
*/
public static File getExternalCacheDir(Context context) {
// 这个sd卡中文件路径下的内容会随着,程序卸载或者设置中清除缓存后一起清空
final String cacheDir = "/Android/data/" + context.getPackageName() + "/cache/";
return new File(Environment.getExternalStorageDirectory().getPath() + cacheDir);
}
/**
* 获取文件路径空间大小
* @param path
* @return
*/
public static long getUsableSpace(File path) {
try{
final StatFs stats = new StatFs(path.getPath());
return (long) stats.getBlockSize() * (long) stats.getAvailableBlocks();
}catch (Exception e) {
e.printStackTrace();
return -1;
}
}
/**
* 空间大小单位格式化
* @param size
* @return
*/
public static String formatSize(long size) {
// Formatter.formatFileSize()
String suffix = null;
float fSize=0;
if (size >= 1024) {
suffix = "KB";
fSize=size / 1024;
if (fSize >= 1024) {
suffix = "MB";
fSize /= 1024;
}
if (fSize >= 1024) {
suffix = "GB";
fSize /= 1024;
}
} else {
fSize = size;
}
java.text.DecimalFormat df = new java.text.DecimalFormat("#0.00");
StringBuilder resultBuffer = new StringBuilder(df.format(fSize));
if (suffix != null)
resultBuffer.append(suffix);
return resultBuffer.toString();
}
/**
* 检查SD卡是否存在
*
* @return
*/
public static boolean checkSDCard() {
final String status = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(status)) {
return true;
}
return false;
}
/**
* 获取安装在用户手机上的com.itlanbao.app下的files目录
*
* @return files path
*/
public static String getAppFilesDir(Context context) {
return context.getFilesDir().getAbsolutePath();
}
/**
* 获取安装在用户手机上的com.itlanbao.yyapp下的cache目录
*
* @return cache path
*/
public static String getAppCacheDir(Context context) {
return context.getCacheDir().getPath();
}
/**
* 创建app主目录
*
* @return boolean
*/
public static boolean checkFileDirectory(Context context) {
final File resDir = FileUtils.getDiskCacheDir(context);
if (!resDir.exists()) {
return resDir.mkdirs();
}
return true;
}
/**
* 创建缓存文件夹
*/
public static void initCacheFile(Context context) {
if (LogUtils.DEBUG) {
LogUtils.v("initCacheFile");
}
final String cacheDir = FileUtils.getDiskCacheDir(context).getAbsolutePath();
final String imageDirPath = cacheDir + FileConstants.CACHE_IMAGE_DIR;
final File imageFileDir = new File(imageDirPath);
if (!imageFileDir.exists()) {
boolean isOk = imageFileDir.mkdirs();
if (LogUtils.DEBUG) {
LogUtils.v(imageDirPath + " 文件夹创建isOk" + isOk);
}
}
final String audioDirPath = cacheDir + FileConstants.CACHE_AUDIO_DIR;
final File audioFileDir = new File(audioDirPath);
if (!audioFileDir.exists()) {
boolean isOk = audioFileDir.mkdirs();
if (LogUtils.DEBUG) {
LogUtils.v(audioDirPath + " 文件夹创建isOk" + isOk);
}
}
final String messageDirPath = cacheDir + FileConstants.CACHE_MESSAGE_DIR;
final File messageFileDir = new File(messageDirPath);
if (!messageFileDir.exists()) {
boolean isOk = messageFileDir.mkdirs();
if (LogUtils.DEBUG) {
LogUtils.v(imageDirPath + " 文件夹创建isOk" + isOk);
}
}
}
/**
* 读取文件
*
* @param sFileName
* @return
*/
public static String readFile(String sFileName) {
if (TextUtils.isEmpty(sFileName)) {
return null;
}
final StringBuffer sDest = new StringBuffer();
final File f = new File(sFileName);
if (!f.exists()) {
return null;
}
try {
FileInputStream is = new FileInputStream(f);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
try {
String data = null;
while ((data = br.readLine()) != null) {
sDest.append(data);
}
} catch (IOException ioex) {
if (LogUtils.DEBUG) {
LogUtils.e(ioex);
}
} finally {
is.close();
is = null;
br.close();
br = null;
}
} catch (Exception ex) {
if (LogUtils.DEBUG) {
LogUtils.e(ex);
}
} catch (OutOfMemoryError ex) {
if (LogUtils.DEBUG) {
ex.printStackTrace();
}
}
return sDest.toString().trim();
}
/**
* 从assets 文件夹中获取文件并读取数据
*
* @param context
* @param fileName
* @param isEncoding
* @return
*/
public static String getFromAssets(Context context, String fileName ) {
String result = "";
try {
final InputStream in = context.getResources().getAssets()
.open(fileName);
// 获取文件的字节数
final int lenght = in.available();
// 创建byte数组
byte[] buffer = new byte[lenght];
// 将文件中的数据读到byte数组中
in.read(buffer);
result = EncodingUtils.getString(buffer, "UTF-8");
in.close();
buffer = null;
} catch(FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
if (LogUtils.DEBUG) {
LogUtils.e(e);
}
}
return result;
}
/**
* 保存文件
*
* @param sToSave
* @param sFileName
* @param isAppend
* @return
*/
public static boolean writeStringToFile(String content, String fileName, boolean isAppend) {
return writeStringToFile(content, "", fileName, isAppend);
}
public static boolean writeStringToFile(String content,
String directoryPath, String fileName, boolean isAppend) {
if (!TextUtils.isEmpty(content)) {
if (!TextUtils.isEmpty(directoryPath)) {// 是否需要创建新的目录
final File threadListFile = new File(directoryPath);
if (!threadListFile.exists()) {
threadListFile.mkdirs();
}
}
boolean bFlag = false;
final int iLen = content.length();
final File file = new File(fileName);
try {
if (!file.exists()) {
file.createNewFile();
}
final FileOutputStream fos = new FileOutputStream(file,
isAppend);
byte[] buffer = new byte[iLen];
try {
buffer = content.getBytes();
fos.write(buffer);
if (isAppend) {
fos.write("||".getBytes());
}
fos.flush();
bFlag = true;
} catch (IOException ioex) {
if (LogUtils.DEBUG) {
LogUtils.e(ioex);
}
} finally {
fos.close();
buffer = null;
}
} catch (Exception ex) {
if (LogUtils.DEBUG) {
LogUtils.e(ex);
}
} catch (OutOfMemoryError o) {
if (LogUtils.DEBUG) {
o.printStackTrace();
}
}
return bFlag;
}
return false;
}
/**
* 重命名
*
* @param filePath
* @return
*/
public static boolean rename(String filePath, String newFilePath) {
if (LogUtils.DEBUG) {
LogUtils.e("filePath " + filePath);
LogUtils.e("newFilePath " + newFilePath);
}
if (!TextUtils.isEmpty(filePath)) {
final File file = new File(filePath);
final File newFile = new File(newFilePath);
if (file.exists()) {
return file.renameTo(newFile);
}
}
return false;
}
/**
* 删除文件
*
* @param filePath
* @return
*/
public static boolean deleteFile(String filePath) {
if (LogUtils.DEBUG) {
LogUtils.e("deleteFile path " + filePath);
}
if (!TextUtils.isEmpty(filePath)) {
final File file = new File(filePath);
if (LogUtils.DEBUG) {
LogUtils.e("deleteFile path exists " + file.exists());
}
if (file.exists()) {
return file.delete();
}
}
return false;
}
/**
* 删除文件夹下所有文件
*
* @return
*/
public static void deleteDirectoryAllFile(String directoryPath) {
final File file = new File(directoryPath);
deleteDirectoryAllFile(file);
}
public static void deleteDirectoryAllFile(File file) {
if (!file.exists()) {
return;
}
boolean rslt = true;// 保存中间结果
if (!(rslt = file.delete())) {// 先尝试直接删除
// 若文件夹非空。枚举、递归删除里面内容
final File subs[] = file.listFiles();
final int size = subs.length - 1;
for (int i = 0; i <= size; i++) {
if (subs[i].isDirectory())
deleteDirectoryAllFile(subs[i]);// 递归删除子文件夹内容
rslt = subs[i].delete();// 删除子文件夹本身
}
// rslt = file.delete();// 删除此文件夹本身
}
if (!rslt) {
if (LogUtils.DEBUG) {
LogUtils.w("无法删除:" + file.getName());
}
return;
}
}
/**
* 根据后缀名删除文件
*
* @param delpath
* path of file
* @param delEndName
* end name of file
* @return boolean the result
*/
public static boolean deleteEndFile(String delPath, String delEndName) {
// param is null
if (delPath == null || delEndName == null) {
return false;
}
try {
// create file
final File file = new File(delPath);
if (file != null) {
if (file.isDirectory()) {
// file list
String[] fileList = file.list();
File delFile = null;
// digui
final int size = fileList.length;
for (int i = 0; i < size; i++) {
// create new file
delFile = new File(delPath + "/" + fileList[i]);
if (delFile != null && delFile.isFile()) {// 删除该文件夹下所有文件以delEndName为后缀的文件(不包含子文件夹里的文件)
// if (delFile != null) {//
// 删除该文件夹下所有文件以delEndName为后缀的文件(包含子文件夹里的文件)
deleteEndFile(delFile.toString(), delEndName);
} else {
// nothing
}
}
} else if (file.isFile()) {
// check the end name
if (file.toString().contains(".")
&& file.toString()
.substring(
(file.toString().lastIndexOf(".") + 1))
.equals(delEndName)) {
// file delete
file.delete();
}
}
}
} catch (Exception ex) {
if (LogUtils.DEBUG) {
LogUtils.e(ex);
}
return false;
}
return true;
}
/**
* 删除文件夹内所有文件
*
* @param delpath
* delpath path of file
* @return boolean the result
*/
public static boolean deleteAllFile(String delpath) {
try {
// create file
final File file = new File(delpath);
if (!file.isDirectory()) {
file.delete();
} else if (file.isDirectory()) {
final String[] filelist = file.list();
final int size = filelist.length;
for (int i = 0; i < size; i++) {
// create new file
final File delfile = new File(delpath + "/" + filelist[i]);
if (!delfile.isDirectory()) {
delfile.delete();
} else if (delfile.isDirectory()) {
// digui
deleteFile(delpath + "/" + filelist[i]);
}
}
file.delete();
}
} catch (Exception ex) {
if (LogUtils.DEBUG) {
LogUtils.e(ex);
}
return false;
}
return true;
}
/**
* 删除目录(文件夹)以及目录下的文件
*
* @param sPath
* 被删除目录的文件路径
* @return 目录删除成功返回true,否则返回false
*/
public static boolean deleteDirectory(String sPath) {
if (TextUtils.isEmpty(sPath)) {
return false;
}
boolean flag;
// 如果sPath不以文件分隔符结尾,自动添加文件分隔符
if (!sPath.endsWith(File.separator)) {
sPath = sPath + File.separator;
}
final File dirFile = new File(sPath);
// 如果dir对应的文件不存在,或者不是一个目录,则退出
if (!dirFile.exists() || !dirFile.isDirectory()) {
return false;
}
flag = true;
// 删除文件夹下的所有文件(包括子目录)
final File[] files = dirFile.listFiles();
if (files != null && files.length > 0) {
for (int i = 0; i < files.length; i++) {
// 删除子文件
if (files[i].isFile()) {
flag = deleteFile(files[i].getAbsolutePath());
if (!flag)
break;
} // 删除子目录
else {
flag = deleteDirectory(files[i].getAbsolutePath());
if (!flag)
break;
}
}
}
if (!flag)
return false;
// 删除当前目录
if (dirFile.delete()) {
return true;
} else {
return false;
}
}
/**
* 获取后缀名
*
* @param path
* 全路径
* @return
*/
public static String getFileExtName(String path) {
String ext = "";
if ((path != null) && (path.length() > 0)) {
int dot = path.lastIndexOf('.');
if ((dot > -1) && (dot < (path.length() - 1))) {
ext = path.substring(dot + 1);
}
}
return ext;
}
/**
* 获取文件名
*
* @param path
* 全路径
* @return
*/
public static String getFileName(String path) {
if (!TextUtils.isEmpty(path)) {
return path.substring(path.lastIndexOf(File.separator) + 1);
}
return "";
}
/**
* 获取文件所在的文件路径
*
* @param path
* @return
*/
public static String getFilePath(String path) {
return path.substring(0, path.lastIndexOf(File.separator) + 1);
}
/**
* 复制文件
*
* @param srcPath : 源文件全路径
* @param destPath : 目标文件全路径
* @return
*/
public static long copyFile(String srcPath, String destPath) {
try {
int position = destPath.lastIndexOf(File.separator);
String dir = destPath.substring(0, position);
String newFileName = destPath.substring(position+1);
final File cacheDir = new File(dir);
if (!cacheDir.exists()) {
cacheDir.mkdirs();
}
return copyFile(new File(srcPath), new File(dir), newFileName);
} catch (Exception e) {
return 0;
}
}
/**
* 复制文件(以超快的速度复制文件)
*
* @param srcFile
* 源文件File
* @param destDir
* 目标目录File
* @param newFileName
* 新文件名
* @return 实际复制的字节数,如果文件、目录不存在、文件为null或者发生IO异常,返回-1
*/
@SuppressWarnings("resource")
public static long copyFile(final File srcFile, final File destDir, String newFileName) {
long copySizes = 0;
if (!srcFile.exists()) {
if (LogUtils.DEBUG) {
LogUtils.d("源文件不存在");
}
copySizes = -1;
} else if (!destDir.exists()) {
if (LogUtils.DEBUG) {
LogUtils.d("目标目录不存在");
}
copySizes = -1;
} else if (newFileName == null) {
if (LogUtils.DEBUG) {
LogUtils.d("文件名为null");
}
copySizes = -1;
} else {
FileChannel fcin = null;
FileChannel fcout = null;
try {
fcin = new FileInputStream(srcFile).getChannel();
fcout = new FileOutputStream(new File(destDir, newFileName)).getChannel();
long size = fcin.size();
fcin.transferTo(0, fcin.size(), fcout);
copySizes = size;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fcin != null) {
fcin.close();
}
if (fcout != null) {
fcout.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
return copySizes;
}
/**
* 判断asset下是否存在某个文件
*
* @param context
* @param fileName
* 如:aa.txt或image/aa.jpg
* @return
*/
public static boolean existInAsset(Context context, String fileName) {
boolean exist = false;
try {
String[] u = context.getAssets().list(getFilePath(fileName));
for (String item : u) {
if (item.equals(getFileName(fileName))) {
exist = true;
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
return exist;
}
/**
* 获取目录文件个数
*
* @param f
* @return
*/
public static long getlist(File f) {
long size = 0;
try {
File flist[] = f.listFiles();
size = flist.length;
for (int i = 0; i < flist.length; i++) {
final File file = flist[i];
if (file == null) {
continue;
}
if (file.isDirectory()) {
size = size + getlist(file);
size--;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return size;
}
/**
* 获取文件夹下所有文件大小
*
* @param f
* @return
*/
public static long getFileSize(File f) {
long size = 0;
try {
File flist[] = f.listFiles();
for (int i = 0; i < flist.length; i++) {
final File file = flist[i];
if (file == null) {
continue;
}
if (file.isDirectory()) {
size = size + getFileSize(file);
} else {
size = size + file.length();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return size;
}
/**
* 调用此方法自动计算指定文件或指定文件夹的大小
*
* @param filePath 文件路径
* @return 计算好的带B、KB、MB、GB的字符串
*/
public static String getAutoFileOrFilesSize(File file) {
if (file == null) {
return "0B";
}
final long blockSize = getFileSize(file);
if (LogUtils.DEBUG) {
LogUtils.d("getAutoFileOrFilesSize 文件大小:" + blockSize);
}
return FormetFileSize(blockSize);
}
/**
* 转换文件大小
* @param fileS
* @return
*/
private static String FormetFileSize(long fileS) {
final DecimalFormat df = new DecimalFormat("#.00");
String fileSizeString = "";
String wrongSize = "0B";
if (fileS == 0) {
return wrongSize;
}
if (fileS < 1024) {
fileSizeString = df.format((double) fileS) + "B";
} else if (fileS < 1048576) {
fileSizeString = df.format((double) fileS / 1024) + "KB";
} else if (fileS < 1073741824) {
fileSizeString = df.format((double) fileS / 1048576) + "MB";
} else {
fileSizeString = df.format((double) fileS / 1073741824) + "GB";
}
return fileSizeString;
}
/**
* 将字符串写入到文本文件中
*
* @param strcontent
*/
public static void writeFileSdcard(String strcontent) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date curDate = new Date(System.currentTimeMillis());// 获取当前时间
String str = formatter.format(curDate);
// 每次写入时,都换行写
String strContent = "-------当前时间===" + str + "\r\n" + strcontent + "\r\n";
try {
String strFilePath = Environment.getExternalStorageDirectory() + "/lunxun.text";
File file = new File(strFilePath);
if (!file.exists()) {
Log.d("TestFile", "Create the file:" + strFilePath);
file.createNewFile();
}
RandomAccessFile raf = new RandomAccessFile(file, "rw");
raf.seek(file.length());
raf.write(strContent.getBytes());
raf.close();
} catch (Exception e) {
Log.e("TestFile", "Error on write File.");
}
}
}