536 lines
15 KiB
Java
536 lines
15 KiB
Java
package com.arialyy.frame.util;
|
||
|
||
import android.content.Context;
|
||
import android.content.Intent;
|
||
import android.content.pm.ApplicationInfo;
|
||
import android.content.pm.PackageInfo;
|
||
import android.content.pm.PackageManager;
|
||
import android.graphics.Bitmap;
|
||
import android.graphics.BitmapFactory;
|
||
import android.graphics.drawable.Drawable;
|
||
import android.media.MediaMetadataRetriever;
|
||
import android.net.Uri;
|
||
import android.support.annotation.NonNull;
|
||
import android.text.TextUtils;
|
||
import com.arialyy.frame.util.show.FL;
|
||
import com.arialyy.frame.util.show.L;
|
||
import java.io.BufferedInputStream;
|
||
import java.io.BufferedOutputStream;
|
||
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.ObjectInputStream;
|
||
import java.io.ObjectOutputStream;
|
||
import java.io.OutputStream;
|
||
import java.io.UnsupportedEncodingException;
|
||
import java.math.BigDecimal;
|
||
import java.math.BigInteger;
|
||
import java.security.MessageDigest;
|
||
import java.security.NoSuchAlgorithmException;
|
||
import java.util.Enumeration;
|
||
import java.util.Formatter;
|
||
import java.util.Locale;
|
||
import java.util.zip.ZipEntry;
|
||
import java.util.zip.ZipFile;
|
||
|
||
/**
|
||
* 文件操作工具 可以创建和删除文件等
|
||
*/
|
||
public class FileUtil {
|
||
private static final String KB = "KB";
|
||
private static final String MB = "MB";
|
||
private static final String GB = "GB";
|
||
|
||
private static final String TAG = "FileUtil";
|
||
|
||
//android获取一个用于打开HTML文件的intent
|
||
public static Intent getHtmlFileIntent(String Path) {
|
||
File file = new File(Path);
|
||
Uri uri = Uri.parse(file.toString())
|
||
.buildUpon()
|
||
.encodedAuthority("com.android.htmlfileprovider")
|
||
.scheme("content")
|
||
.encodedPath(file.toString())
|
||
.build();
|
||
Intent intent = new Intent("android.intent.action.VIEW");
|
||
intent.setDataAndType(uri, "text/html");
|
||
return intent;
|
||
}
|
||
|
||
/**
|
||
* 获取文件夹大小
|
||
*/
|
||
public static long getDirSize(String filePath) {
|
||
long size = 0;
|
||
File f = new File(filePath);
|
||
if (f.isDirectory()) {
|
||
File[] files = f.listFiles();
|
||
for (File file : files) {
|
||
if (file.isDirectory()) {
|
||
size += getDirSize(file.getPath());
|
||
continue;
|
||
}
|
||
size += file.length();
|
||
}
|
||
} else {
|
||
size += f.length();
|
||
}
|
||
return size;
|
||
}
|
||
|
||
/**
|
||
* 存储bitmap
|
||
*/
|
||
public static void saveBitmap(@NonNull String filePath, @NonNull Bitmap bitmap) {
|
||
File file = createFile(filePath);
|
||
try {
|
||
FileOutputStream os = new FileOutputStream(file);
|
||
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
|
||
os.flush();
|
||
os.close();
|
||
} catch (FileNotFoundException e) {
|
||
e.printStackTrace();
|
||
} catch (IOException e) {
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 格式化文件大小
|
||
*
|
||
* @param size file.length() 获取文件大小
|
||
*/
|
||
public static String formatFileSize(double size) {
|
||
double kiloByte = size / 1024;
|
||
if (kiloByte < 1) {
|
||
return size + "B";
|
||
}
|
||
|
||
double megaByte = kiloByte / 1024;
|
||
if (megaByte < 1) {
|
||
BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));
|
||
return result1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "KB";
|
||
}
|
||
|
||
double gigaByte = megaByte / 1024;
|
||
if (gigaByte < 1) {
|
||
BigDecimal result2 = new BigDecimal(Double.toString(megaByte));
|
||
return result2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "MB";
|
||
}
|
||
|
||
double teraBytes = gigaByte / 1024;
|
||
if (teraBytes < 1) {
|
||
BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));
|
||
return result3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "GB";
|
||
}
|
||
BigDecimal result4 = new BigDecimal(teraBytes);
|
||
return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB";
|
||
}
|
||
|
||
/**
|
||
* 获取文件后缀名
|
||
*/
|
||
public static String getFileExtensionName(String fileName) {
|
||
if (TextUtils.isEmpty(fileName)) {
|
||
return "";
|
||
}
|
||
int endP = fileName.lastIndexOf(".");
|
||
return endP > -1 ? fileName.substring(endP + 1, fileName.length()) : "";
|
||
}
|
||
|
||
/**
|
||
* 校验文件MD5码
|
||
*/
|
||
public static boolean checkMD5(String md5, File updateFile) {
|
||
if (TextUtils.isEmpty(md5) || updateFile == null) {
|
||
L.e(TAG, "MD5 string empty or updateFile null");
|
||
return false;
|
||
}
|
||
|
||
String calculatedDigest = getFileMD5(updateFile);
|
||
if (calculatedDigest == null) {
|
||
L.e(TAG, "calculatedDigest null");
|
||
return false;
|
||
}
|
||
return calculatedDigest.equalsIgnoreCase(md5);
|
||
}
|
||
|
||
/**
|
||
* 获取文件MD5码
|
||
*/
|
||
public static String getFileMD5(File updateFile) {
|
||
MessageDigest digest;
|
||
try {
|
||
digest = MessageDigest.getInstance("MD5");
|
||
} catch (NoSuchAlgorithmException e) {
|
||
L.e(TAG, "Exception while getting digest", e);
|
||
return null;
|
||
}
|
||
|
||
InputStream is;
|
||
try {
|
||
is = new FileInputStream(updateFile);
|
||
} catch (FileNotFoundException e) {
|
||
L.e(TAG, "Exception while getting FileInputStream", e);
|
||
return null;
|
||
}
|
||
|
||
byte[] buffer = new byte[8192];
|
||
int read;
|
||
try {
|
||
while ((read = is.read(buffer)) > 0) {
|
||
digest.update(buffer, 0, read);
|
||
}
|
||
byte[] md5sum = digest.digest();
|
||
BigInteger bigInt = new BigInteger(1, md5sum);
|
||
String output = bigInt.toString(16);
|
||
// Fill to 32 chars
|
||
output = String.format("%32s", output).replace(' ', '0');
|
||
return output;
|
||
} catch (IOException e) {
|
||
throw new RuntimeException("Unable to process file for MD5", e);
|
||
} finally {
|
||
try {
|
||
is.close();
|
||
} catch (IOException e) {
|
||
L.e(TAG, "Exception on closing MD5 input stream", e);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 解压缩功能.
|
||
* 将ZIP_FILENAME文件解压到ZIP_DIR目录下.
|
||
*
|
||
* @param zipFile 压缩文件
|
||
* @param folderPath 解压目录
|
||
*/
|
||
public static int unZipFile(File zipFile, String folderPath) {
|
||
ZipFile zfile = null;
|
||
try {
|
||
zfile = new ZipFile(zipFile);
|
||
Enumeration zList = zfile.entries();
|
||
ZipEntry ze = null;
|
||
byte[] buf = new byte[1024];
|
||
while (zList.hasMoreElements()) {
|
||
ze = (ZipEntry) zList.nextElement();
|
||
if (ze.isDirectory()) {
|
||
// L.d(TAG, "ze.getName() = " + ze.getName());
|
||
String dirstr = folderPath + ze.getName();
|
||
//dirstr.trim();
|
||
dirstr = new String(dirstr.getBytes("8859_1"), "GB2312");
|
||
// L.d(TAG, "str = " + dirstr);
|
||
File f = new File(dirstr);
|
||
f.mkdir();
|
||
continue;
|
||
}
|
||
// L.d(TAG, "ze.getName() = " + ze.getName());
|
||
OutputStream os = new BufferedOutputStream(
|
||
new FileOutputStream(getRealFileName(folderPath, ze.getName())));
|
||
InputStream is = new BufferedInputStream(zfile.getInputStream(ze));
|
||
int readLen = 0;
|
||
while ((readLen = is.read(buf)) != -1) {
|
||
os.write(buf, 0, readLen);
|
||
}
|
||
is.close();
|
||
os.close();
|
||
}
|
||
zfile.close();
|
||
} catch (IOException e) {
|
||
e.printStackTrace();
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
/**
|
||
* 给定根目录,返回一个相对路径所对应的实际文件名.
|
||
*
|
||
* @param baseDir 指定根目录
|
||
* @param absFileName 相对路径名,来自于ZipEntry中的name
|
||
* @return java.io.File 实际的文件
|
||
*/
|
||
private static File getRealFileName(String baseDir, String absFileName) {
|
||
String[] dirs = absFileName.split("/");
|
||
File ret = new File(baseDir);
|
||
String substr = null;
|
||
if (dirs.length > 1) {
|
||
for (int i = 0; i < dirs.length - 1; i++) {
|
||
substr = dirs[i];
|
||
try {
|
||
//substr.trim();
|
||
substr = new String(substr.getBytes("8859_1"), "GB2312");
|
||
} catch (UnsupportedEncodingException e) {
|
||
e.printStackTrace();
|
||
}
|
||
ret = new File(ret, substr);
|
||
}
|
||
// L.d("upZipFile", "1ret = " + ret);
|
||
if (!ret.exists()) ret.mkdirs();
|
||
substr = dirs[dirs.length - 1];
|
||
try {
|
||
//substr.trim();
|
||
substr = new String(substr.getBytes("8859_1"), "GB2312");
|
||
// L.d("upZipFile", "substr = " + substr);
|
||
} catch (UnsupportedEncodingException e) {
|
||
e.printStackTrace();
|
||
}
|
||
ret = new File(ret, substr);
|
||
// L.d("upZipFile", "2ret = " + ret);
|
||
return ret;
|
||
}
|
||
|
||
return ret;
|
||
}
|
||
|
||
/**
|
||
* 通过流创建文件
|
||
*/
|
||
public static void createFileFormInputStream(InputStream is, String path) {
|
||
try {
|
||
FileOutputStream fos = new FileOutputStream(path);
|
||
byte[] buf = new byte[1376];
|
||
while (is.read(buf) > 0) {
|
||
fos.write(buf, 0, buf.length);
|
||
}
|
||
is.close();
|
||
fos.flush();
|
||
fos.close();
|
||
} catch (FileNotFoundException e) {
|
||
e.printStackTrace();
|
||
} catch (IOException e) {
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 从文件读取对象
|
||
*/
|
||
public static Object readObj(String path) {
|
||
FileInputStream fis = null;
|
||
ObjectInputStream ois = null;
|
||
try {
|
||
fis = new FileInputStream(path);
|
||
ois = new ObjectInputStream(fis);
|
||
return ois.readObject();
|
||
} catch (FileNotFoundException e) {
|
||
FL.e(TAG, FL.getExceptionString(e));
|
||
} catch (IOException e) {
|
||
FL.e(TAG, FL.getExceptionString(e));
|
||
} catch (ClassNotFoundException e) {
|
||
FL.e(TAG, FL.getExceptionString(e));
|
||
} finally {
|
||
try {
|
||
if (fis != null) {
|
||
fis.close();
|
||
}
|
||
if (ois != null) {
|
||
ois.close();
|
||
}
|
||
} catch (IOException e) {
|
||
FL.e(TAG, FL.getExceptionString(e));
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/**
|
||
* 存储对象到文件,只有实现了Serailiable接口的对象才能被存储
|
||
*/
|
||
public static void writeObj(String path, Object object) {
|
||
FileOutputStream fos = null;
|
||
ObjectOutputStream oos = null;
|
||
File file = new File(path);
|
||
if (!file.getParentFile().exists()) {
|
||
file.mkdirs();
|
||
}
|
||
try {
|
||
fos = new FileOutputStream(path);
|
||
oos = new ObjectOutputStream(fos);
|
||
oos.writeObject(object);
|
||
} catch (FileNotFoundException e) {
|
||
FL.e(TAG, FL.getExceptionString(e));
|
||
} catch (IOException e) {
|
||
FL.e(TAG, FL.getExceptionString(e));
|
||
} finally {
|
||
try {
|
||
if (fos != null) {
|
||
fos.close();
|
||
}
|
||
if (oos != null) {
|
||
oos.close();
|
||
}
|
||
} catch (IOException e) {
|
||
FL.e(TAG, FL.getExceptionString(e));
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 创建文件 当文件不存在的时候就创建一个文件,否则直接返回文件
|
||
*/
|
||
public static File createFile(String path) {
|
||
File file = new File(path);
|
||
if (!file.getParentFile().exists()) {
|
||
FL.d(TAG, "目标文件所在路径不存在,准备创建……");
|
||
if (!createDir(file.getParent())) {
|
||
FL.d(TAG, "创建目录文件所在的目录失败!文件路径【" + path + "】");
|
||
}
|
||
}
|
||
// 创建目标文件
|
||
try {
|
||
if (!file.exists()) {
|
||
if (file.createNewFile()) {
|
||
FL.d(TAG, "创建文件成功:" + file.getAbsolutePath());
|
||
}
|
||
return file;
|
||
} else {
|
||
return file;
|
||
}
|
||
} catch (IOException e) {
|
||
e.printStackTrace();
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/**
|
||
* 创建目录 当目录不存在的时候创建文件,否则返回false
|
||
*/
|
||
public static boolean createDir(String path) {
|
||
File file = new File(path);
|
||
if (!file.exists()) {
|
||
if (!file.mkdirs()) {
|
||
FL.d(TAG, "创建失败,请检查路径和是否配置文件权限!");
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* 拷贝文件
|
||
*/
|
||
public static boolean copy(String fromPath, String toPath) {
|
||
File file = new File(fromPath);
|
||
if (!file.exists()) {
|
||
return false;
|
||
}
|
||
createFile(toPath);
|
||
return copyFile(fromPath, toPath);
|
||
}
|
||
|
||
/**
|
||
* 拷贝文件
|
||
*/
|
||
private static boolean copyFile(String fromFile, String toFile) {
|
||
InputStream fosfrom = null;
|
||
OutputStream fosto = null;
|
||
try {
|
||
fosfrom = new FileInputStream(fromFile);
|
||
fosto = new FileOutputStream(toFile);
|
||
byte bt[] = new byte[1024];
|
||
int c;
|
||
while ((c = fosfrom.read(bt)) > 0) {
|
||
fosto.write(bt, 0, c);
|
||
}
|
||
return true;
|
||
} catch (Exception ex) {
|
||
ex.printStackTrace();
|
||
return false;
|
||
} finally {
|
||
try {
|
||
if (fosfrom != null) {
|
||
fosfrom.close();
|
||
}
|
||
if (fosto != null) {
|
||
fosto.close();
|
||
}
|
||
} catch (IOException e) {
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 删除文件 如果文件存在删除文件,否则返回false
|
||
*/
|
||
public static boolean deleteFile(String path) {
|
||
File file = new File(path);
|
||
if (file.exists()) {
|
||
file.delete();
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* 递归删除目录下的所有文件及子目录下所有文件
|
||
*
|
||
* @param dir 将要删除的文件目录
|
||
* @return 删除成功返回true,否则返回false,如果文件是空,那么永远返回true
|
||
*/
|
||
public static boolean deleteDir(File dir) {
|
||
if (dir == null) {
|
||
return true;
|
||
}
|
||
if (dir.isDirectory()) {
|
||
String[] children = dir.list();
|
||
// 递归删除目录中的子目录下
|
||
for (String aChildren : children) {
|
||
boolean success = deleteDir(new File(dir, aChildren));
|
||
if (!success) {
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
// 目录此时为空,可以删除
|
||
return dir.delete();
|
||
}
|
||
|
||
/**
|
||
* 递归返回文件或者目录的大小(单位:KB)
|
||
* 不建议使用这个方法,有点坑
|
||
* 可以使用下面的方法:http://blog.csdn.net/loongggdroid/article/details/12304695
|
||
*/
|
||
private static float getSize(String path, Float size) {
|
||
File file = new File(path);
|
||
if (file.exists()) {
|
||
if (file.isDirectory()) {
|
||
String[] children = file.list();
|
||
for (int fileIndex = 0; fileIndex < children.length; ++fileIndex) {
|
||
float tmpSize =
|
||
getSize(file.getPath() + File.separator + children[fileIndex], size) / 1000;
|
||
size += tmpSize;
|
||
}
|
||
} else if (file.isFile()) {
|
||
size += file.length();
|
||
}
|
||
}
|
||
return size;
|
||
}
|
||
|
||
/**
|
||
* 获取apk文件的icon
|
||
*
|
||
* @param path apk文件路径
|
||
*/
|
||
public static Drawable getApkIcon(Context context, String path) {
|
||
PackageManager pm = context.getPackageManager();
|
||
PackageInfo info = pm.getPackageArchiveInfo(path, PackageManager.GET_ACTIVITIES);
|
||
if (info != null) {
|
||
ApplicationInfo appInfo = info.applicationInfo;
|
||
//android有bug,需要下面这两句话来修复才能获取apk图片
|
||
appInfo.sourceDir = path;
|
||
appInfo.publicSourceDir = path;
|
||
// String packageName = appInfo.packageName; //得到安装包名称
|
||
// String version=info.versionName; //得到版本信息
|
||
return pm.getApplicationIcon(appInfo);
|
||
}
|
||
return null;
|
||
}
|
||
}
|