import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Environment;
import android.util.Log;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.nio.channels.FileChannel;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
* 文件相關(guān)工具類
* 如:遞歸獲取文件大小,格式化單位,刪除文件或文件夾,壓縮文件,
* 創(chuàng)建一個JPEG格式的圖片文件,拷貝文件
*
*/
public class FileUtils {
/**
* 遞歸獲取文件大小
*
* @param file 文件夾
* @return 文件大小
*/
public static long getFolderSize(File file) {
long size = 0;
try {
File[] fileList = file.listFiles();
for (int i = 0; i < fileList.length; i++) {
// 如果下面還有文件
if (fileList[i].isDirectory()) {
size = size + getFolderSize(fileList[i]);
} else {
size = size + fileList[i].length();
}
}
} catch (Exception e) {
return 0;
}
return size;
}
/**
* 格式化單位
*
* @param size 文件大小
* @return 如10MB、10KB、10GB
*/
public static String getFormatSize(double size) {
double kiloByte = size / 1024;
if (kiloByte < 1) {
if (size == 0) {
return "0MB";
}
return size + "Byte";
}
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";
}
/**
* 刪除文件或文件夾
*
* @param file 文件或文件夾
*/
public static void deleteFiles(File file) {
if (file == null) return;
if (file.isFile() || file.list().length == 0) {
file.delete();
} else {
File[] files = file.listFiles();
for (File f : files) {
deleteFiles(f);//遞歸刪除每一個文件
f.delete();//刪除該文件夾
}
}
}
/**
* 壓縮文件
*
* @param path 文件路徑
* @return 壓縮后的文件
*/
public static File scal(String path) {
File outputFile = new File(path);
long fileSize = outputFile.length();
final long fileMaxSize = 200 * 300;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
double scale = Math.sqrt((float) fileSize / fileMaxSize);
Log.d("scale", scale + "");
options.outHeight = 420;
options.outWidth = 600;
options.inSampleSize = (int) (scale + 0.5);
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(path, options);
outputFile = new File(createImageFile().getPath());
FileOutputStream fos;
try {
fos = new FileOutputStream(outputFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, fos);
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
if (!bitmap.isRecycled()) {
bitmap.recycle();
} else {
File tempFile = outputFile;
outputFile = new File(createImageFile().getPath());
copyFileUsingFileChannels(tempFile, outputFile);
}
return outputFile;
}
/**
* 創(chuàng)建一個JPEG格式的圖片文件
*
* @return 文件File
*/
public static File createImageFile() {
String timeStamp = new SimpleDateFormat("yyyy-MM-dd HH-mm-SS", Locale.CHINA).format(new Date());
String imageFileName = "JPEG_ " + timeStamp + "_";
File storageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
File image = null;
try {
image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
} catch (IOException e) {
e.printStackTrace();
}
return image;
}
/**
* 創(chuàng)建一個JPEG格式的圖片文件
*
* @return 文件Uri
*/
public static Uri createImageFileUri() {
return Uri.fromFile(createImageFile());
}
/**
* 拷貝文件
*
* @param source 初始文件
* @param dest 目標文件
*/
public static void copyFileUsingFileChannels(File source, File dest) {
FileChannel inputChannel = null;
FileChannel outputChannel = null;
try {
inputChannel = new FileInputStream(source).getChannel();
outputChannel = new FileOutputStream(dest).getChannel();
outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
assert inputChannel != null;
inputChannel.close();
assert outputChannel != null;
outputChannel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
[Android][工具類]FileUtils
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- [TOC] 前言 Android SDK原生 API中,有一些常用的工具類,運用得當可以省事省力省時,何況還是An...
- 前言 相信大部分仁兄在使用系統(tǒng)Toast的時候,都感覺不太盡如人意,因為系統(tǒng)Toast顯示的位置比較固定,并且字體...
- Android開發(fā)過程中,我們需要的很多代碼都是重復多次使用的,寫成工具類是一個比較好的做法,下面是我常用的幾個工...