public class FileSizeUtil {
public static final int SIZETYPE_B = 1;// 获取文件大小单位为B的double值
public static final int SIZETYPE_KB = 2;// 获取文件大小单位为KB的double值
public static final int SIZETYPE_MB = 3;// 获取文件大小单位为MB的double值
public static final int SIZETYPE_GB = 4;// 获取文件大小单位为GB的double值
/**
* 获取文件指定文件的指定单位的大小
*
* @param filePath 文件路径
* @param sizeType 获取大小的类型1为B、2为KB、3为MB、4为GB
* @return double值的大小
*/
public static double getFileOrFilesSize(String filePath, int sizeType) {
File file = new File(filePath);
long blockSize = 0;
try {
if (file.isDirectory()) {
blockSize = getFileSizes(file);
} else {
blockSize = getFileSize(file);
}
} catch (Exception e) {
e.printStackTrace();
Log.e("获取文件大小", "获取失败!" + e.getMessage());
}
return FormetFileSize(blockSize, sizeType);
}
/**
* 调用此方法自动计算指定文件或指定文件夹的大小
*
* @param filePath 文件路径
* @return 计算好的带B、KB、MB、GB的字符串
*/
public static String getAutoFileOrFilesSize(String filePath) {
File file = new File(filePath);
long blockSize = 0;
try {
if (file.isDirectory()) {
blockSize = getFileSizes(file);
} else {
blockSize = getFileSize(file);
}
} catch (Exception e) {
e.printStackTrace();
Log.e("获取文件大小", "获取失败!");
}
return FormetFileSize(blockSize);
}
/**
* 获取指定文件大小
*
* @return
* @throws Exception
*/
private static long getFileSize(File file) throws Exception {
long size = 0;
if (file.exists()) {
FileInputStream fis = null;
fis = new FileInputStream(file);
size = fis.available();
} else {
file.createNewFile();
Log.e("获取文件大小", "文件不存在!");
}
return size;
}
/**
* 获取指定文件夹
*
* @param f
* @return
* @throws Exception
*/
private static long getFileSizes(File f) throws Exception {
long size = 0;
File flist[] = f.listFiles();
for (int i = 0; i < flist.length; i++) {
if (flist[i].isDirectory()) {
size = size + getFileSizes(flist[i]);
} else {
size = size + getFileSize(flist[i]);
}
}
return size;
}
/**
* 转换文件大小
*
* @param fileS
* @return
*/
private static String FormetFileSize(long fileS) {
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 fileS
* @param sizeType
* @return
*/
private static double FormetFileSize(long fileS, int sizeType) {
DecimalFormat df = new DecimalFormat("#.00");
double fileSizeLong = 0;
switch (sizeType) {
case SIZETYPE_B:
fileSizeLong = Double.valueOf(df.format((double) fileS));
break;
case SIZETYPE_KB:
fileSizeLong = Double.valueOf(df.format((double) fileS / 1024));
break;
case SIZETYPE_MB:
fileSizeLong = Double.valueOf(df.format((double) fileS / 1048576));
break;
case SIZETYPE_GB:
fileSizeLong = Double.valueOf(df
.format((double) fileS / 1073741824));
break;
default:
break;
}
return fileSizeLong;
}
/**
* 获取本应用的缓存数据
*
* @return
*/
public static String getTheAppCacheSize(Context context) {
double filesSize = 0.00;
if (context.getFilesDir().exists()) {
filesSize = getFileOrFilesSize(context.getFilesDir()
.getAbsolutePath(), 3);
}
// if (context.getCacheDir().exists()) {
// filesSize += getFileOrFilesSize(context.getCacheDir()
// .getAbsolutePath(), 3);
// }
//
// if (new File("/data/data/" + context.getPackageName() + "/databases")
// .exists()) {
// filesSize += getFileOrFilesSize(
// new File("/data/data/" + context.getPackageName()
// + "/databases").getAbsolutePath(), 3);
// }
//
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
filesSize += getFileOrFilesSize(
new File("/data/data/" + context.getPackageName()
+ "/databases").getAbsolutePath(), 3);
}
String filesSizeStr = filesSize + "";
if (filesSizeStr.length() >= 4) {
filesSizeStr = filesSizeStr.substring(0, 4);
}
return filesSizeStr + "MB";
}
@TargetApi(19)
public static String getImageAbsolutePath(Context context, Uri imageUri) {
if (context == null || imageUri == null)
return null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT
&& DocumentsContract.isDocumentUri(context, imageUri)) {
if (isExternalStorageDocument(imageUri)) {
String docId = DocumentsContract.getDocumentId(imageUri);
String[] split = docId.split(":");
String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/"
+ split[1];
}
} else if (isDownloadsDocument(imageUri)) {
String id = DocumentsContract.getDocumentId(imageUri);
Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"),
Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
} else if (isMediaDocument(imageUri)) {
String docId = DocumentsContract.getDocumentId(imageUri);
String[] split = docId.split(":");
String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
String selection = MediaStore.Images.Media._ID + "=?";
String[] selectionArgs = new String[]{split[1]};
return getDataColumn(context, contentUri, selection,
selectionArgs);
}
} // MediaStore (and general)
else if ("content".equalsIgnoreCase(imageUri.getScheme())) {
// Return the remote address
if (isGooglePhotosUri(imageUri))
return imageUri.getLastPathSegment();
return getDataColumn(context, imageUri, null, null);
}
// File
else if ("file".equalsIgnoreCase(imageUri.getScheme())) {
return imageUri.getPath();
}
return null;
}
public static String getDataColumn(Context context, Uri uri,
String selection, String[] selectionArgs) {
Cursor cursor = null;
String column = MediaStore.Images.Media.DATA;
String[] projection = {column};
try {
cursor = context.getContentResolver().query(uri, projection,
selection, selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
int index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is ExternalStorageProvider.
*/
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri
.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is DownloadsProvider.
*/
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri
.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is MediaProvider.
*/
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri
.getAuthority());
}
/**
* @param uri The Uri to check.
* @return Whether the Uri authority is Google Photos.
*/
public static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.content".equals(uri
.getAuthority());
}
public static String substring(String str, int start) {
if (str == null) {
return null;
} else {
if (start < 0) {
start += str.length();
}
if (start < 0) {
start = 0;
}
return start > str.length() ? "" : str.substring(start);
}
}
public static boolean isNumeric(String str) {
Pattern pattern = Pattern.compile("[0-9]*");
return pattern.matcher(str).matches();
}
public static byte[] toPrimitive(Byte[] array) {
if (array == null) {
return null;
} else if (array.length == 0) {
return new byte[0];
} else {
byte[] result = new byte[array.length];
for (int i = 0; i < array.length; ++i) {
result[i] = array[i].byteValue();
}
return result;
}
}
public static boolean containsWhitespace(CharSequence seq) {
if (TextUtils.isEmpty(seq)) {
return false;
} else {
int strLen = seq.length();
for (int i = 0; i < strLen; ++i) {
if (Character.isWhitespace(seq.charAt(i))) {
return true;
}
}
return false;
}
}
private static DecimalFormat df = new DecimalFormat("0.00");
public static String getNumberFormat(Number f) {
if (f == null) {
return null;
}
return df.format(f);
}
/**
* 得到指定路径图片的options,不加载内存
* @param srcPath 源图片路径
* @return Options {@link BitmapFactory.Options}
*/
public static BitmapFactory.Options getBitmapOptions(String srcPath) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(srcPath, options);
return options;
}
/**
* 压缩指定路径图片,并将其保存在缓存目录中;<br>
* 通过isDelSrc判定是否删除源文件,并获取到缓存后的图片路径;<br>
* 图片过大可能OOM
* @param context
* @param srcPath
* @param rqsW
* @param rqsH
* @param isDelSrc
* @return
*/
public static String compressBitmap(Context context, String srcPath,
Bitmap.CompressFormat format,
int rqsW, int rqsH, boolean isDelSrc) {
Bitmap bitmap = compressBitmap(srcPath, rqsW, rqsH);
File srcFile = new File(srcPath);
String desPath = getImageCacheDir(context) + srcFile.getName();
clearCropFile(desPath);
int degree = getDegrees(srcPath);
try {
if (degree != 0) bitmap = rotateBitmap(bitmap, degree);
File file = new File(desPath);
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(format, 70, fos);
fos.close();
if (isDelSrc) srcFile.deleteOnExit();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return desPath;
}
/**
* 压缩指定路径的图片,并得到图片对象
* @param path bitmap source path
* @return Bitmap {@link Bitmap}
*/
public static Bitmap compressBitmap(String path, int rqsW, int rqsH) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
options.inSampleSize = calculateInSampleSize(options, rqsW, rqsH);
options.inPreferredConfig = Bitmap.Config.RGB_565;
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(path, options);
}
/**
* 压缩资源图片,并返回图片对象
* @param res {@link Resources}
* @param resID
* @param reqsW
* @param reqsH
* @return
*/
public static Bitmap compressBitmap(Resources res, int resID, int reqsW, int reqsH) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resID, options);
options.inSampleSize = calculateInSampleSize(options, reqsW, reqsH);
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resID, options);
}
/**
* 基于质量的压缩算法, 此方法未 解决压缩后图像失真问题
* <br> 可先调用比例压缩适当压缩图片后,再调用此方法可解决上述问题
* <br> 压缩格式为JPEG
* @param bitmap
* @param maxBytes 压缩后的图像最大大小 单位为byte
* @return
*/
public static Bitmap compressBitmap(Bitmap bitmap, long maxBytes) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
int options = 90;
while (baos.toByteArray().length > maxBytes) {
baos.reset();
bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);
options -= 10;
}
byte[] bts = baos.toByteArray();
Bitmap bmp = BitmapFactory.decodeByteArray(bts, 0, bts.length);
baos.close();
return bmp;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
/**
* calculate the bitmap sampleSize
* @param options
* @return
*/
public static int calculateInSampleSize(BitmapFactory.Options options, int rqsW, int rqsH) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (rqsW == 0 || rqsH == 0) return 1;
if (height > rqsH || width > rqsW) {
final int heightRatio = Math.round((float) height/ (float) rqsH);
final int widthRatio = Math.round((float) width / (float) rqsW);
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
/**
* 获取图片缓存路径
* @param context
* @return
*/
private static String getImageCacheDir(Context context) {
String dir = context.getCacheDir() + "Image" + File.separator;
File file = new File(dir);
if (!file.exists()) file.mkdirs();
return dir;
}
/**
* get the orientation of the bitmap {@link ExifInterface}
* @param path 图片路径
* @return
*/
public static int getDegrees(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
/**
* rotate the bitmap
* @param bitmap
* @param degrees
* @return
*/
public static Bitmap rotateBitmap(Bitmap bitmap, int degrees) {
if (bitmap != null) {
Matrix m = new Matrix();
m.postRotate(degrees);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true);
return bitmap;
}
return null;
}
public static boolean saveBitmap(Bitmap bitmap, String path,
Bitmap.CompressFormat format, int quality) {
try {
File file = new File(path);
Log.i("tag", "压缩后:" + file.length());
File parent = file.getParentFile();
if (!parent.exists()) {
parent.mkdirs();
}
FileOutputStream fos = new FileOutputStream(file);
boolean b = bitmap.compress(format, quality, fos);
fos.flush();
fos.close();
return b;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 删除文件
*
* @param uri 文件Uri
* @return 成功与否
*/
public static boolean clearCropFile(Uri uri) {
if (uri == null) {
return false;
}
return clearCropFile(uri.getPath());
}
/**
* 删除文件
*
* @param path 文件路径
* @return 成功与否
*/
public static boolean clearCropFile(String path) {
if (TextUtils.isEmpty(path)) {
return false;
}
//有时文件明明存在 但 file.exists为false
File file = new File(path);
//System.out.println("工具判断:"+FileUtils.exists(file)+" 原始判断:"+file.exists()+" \npath:"+file.getPath());
if (file.exists()) {
boolean result = file.delete();
if (result) {
System.out.println("Cached crop file cleared.");
} else {
System.out.println("Failed to clear cached crop file.");
}
return result;
} else {
System.out.println("Trying to clear cached crop file but it does not exist.");
}
return false;
}
}
文件相关工具类
最新推荐文章于 2023-06-11 15:58:03 发布