FileUtils.java import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.DecimalFormat;
import android.content.Context;
import android.nfc.Tag;
import android.os.Environment;
import android.os.StatFs;
public class FileUtils {
protected static final String TAG = FileUtils.class.getSimpleName();
/**
* 获取SD卡路径
* @return
*/
public static String getSDCardPath() {
return Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator;
}
/**
* 判断SD卡是否可用
* @return
*/
public static boolean isSDCardAvailable() {
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
return true;
}
return false;
}
/**
* 获取SD卡剩余空间
* @return
*/
public static long getSDFreeSize() {
if (isSDCardAvailable()) {
StatFs statFs = new StatFs(getSDCardPath());
long blockSize = statFs.getBlockSize();
long freeBlocks = statFs.getAvailableBlocks();
return freeBlocks * blockSize;
}
return 0;
}
/**
* 获取SD卡的总容量
* @return
*/
public static long getSDAllSize() {
if (isSDCardAvailable()) {
StatFs stat = new StatFs(getSDCardPath());
// 获取空闲的数据块的数量
long availableBlocks = (long) stat.getAvailableBlocks() - 4;
// 获取单个数据块的大小(byte)
long freeBlocks = stat.getAvailableBlocks();
return freeBlocks * availableBlocks;
}
return 0;
}
/**
* 获取指定路径所在空间的剩余可用容量字节数
* @param filePath
* @return 容量字节 SDCard可用空间,内部存储可用空间
*/
public static long getFreeBytes(String filePath) {
// 如果是sd卡的下的路径,则获取sd卡可用容量
if (filePath.startsWith(getSDCardPath())) {
filePath = getSDCardPath();
} else {// 如果是内部存储的路径,则获取内存存储的可用容量
filePath = Environment.getDataDirectory().getAbsolutePath();
}
StatFs stat = new StatFs(filePath);
long availableBlocks = (long) stat.getAvailableBlocks() - 4;
return stat.getBlockSize() * availableBlocks;
}
/**
* 拷贝文件,通过返回值判断是否拷贝成功
* @param sourcePath
* 源文件路径
* @param targetPath
* 目标文件路径
* @return
*/
public static boolean copyFile(String sourcePath, String targetPath) {
boolean isOK = false;
if (!StringUtils.isEmptyOrNull(sourcePath) && !StringUtils.isEmptyOrNull(targetPath)) {
File sourcefile = new File(sourcePath);
File targetFile = new File(targetPath);
if (!sourcefile.exists()) {
return false;
}
if (sourcefile.isDirectory()) {
isOK = copyDir(sourcefile, targetFile);
} else if (sourcefile.isFile()) {
if (!targetFile.exists()) {
createFile(targetPath);
}
FileOutputStream outputStream = null;
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(sourcefile);
outputStream = new FileOutputStream(targetFile);
byte[] bs = new byte[1024];
int len;
while ((len = inputStream.read(bs)) != -1) {
outputStream.write(bs, 0, len);
}
isOK = true;
} catch (Exception e) {
Logger.i(TAG, e.getLocalizedMessage());
Logger.i(TAG, e.getLocalizedMessage());
isOK = false;
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
Logger.i(TAG, e.getLocalizedMessage());
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
Logger.i(TAG, e.getLocalizedMessage());
}
}
}
}
return isOK;
}
return false;
}
/**
* 删除文件
* @param path
* @return
*/
public static boolean deleteFile(String path) {
if (!StringUtils.isEmptyOrNull(path)) {
File file = new File(path);
if (!file.exists()) {
return false;
}
try {
file.delete();
} catch (Exception e) {
Logger.i(TAG, e.getLocalizedMessage());
return false;
}
return true;
}
return false;
}
/**
* 统计文件夹文件的大小
*/
public static long getSize(File file) {
// 判断文件是否存在
if (file.exists()) {
// 如果是目录则递归计算其内容的总大小,如果是文件则直接返回其大小
if (!file.isFile()) {
// 获取文件大小
File[] fl = file.listFiles();
long ss = 0;
for (File f : fl)
ss += getSize(f);
return ss;
} else {
long ss = (long) file.length();
return ss; // 单位制bytes
}
} else {
// System.out.println("文件或者文件夹不存在,请检查路径是否正确!");
return 0;
}
}
/**
* 把bytes转换成MB
*/
public static String getTrafficStr(long total) {
DecimalFormat format = new DecimalFormat("##0.0");
if (total < 1024 * 1024) {
return format.format(total / 1024f) + "KB";
} else if (total < 1024 * 1024 * 1024) {
return format.format(total / 1024f / 1024f) + "MB";
} else if (total < 1024 * 1024 * 1024 * 1024) {
return format.format(total / 1024f / 1024f / 1024f) + "GB";
} else {
return "统计错误";
}
}
/**
* 删除文件夹里面的所以文件
*/
public static void deleteDir(File dir) {
if (dir.exists()) {
File[] files = dir.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
files[i].delete();
} else {
deleteDir(files[i]);
}
}
}
}
/**
* 剪切文件,将文件拷贝到目标目录,再将源文件删除
* @param sourcePath
* @param targetPath
*/
public static boolean cutFile(String sourcePath, String targetPath) {
boolean isSuccessful = copyFile(sourcePath, targetPath);
if (isSuccessful) {
// 拷贝成功则删除源文件
return deleteFile(sourcePath);
}
return false;
}
/**
* 拷贝目录
* @param sourceFile
* @param targetFile
* @return
*/
public static boolean copyDir(File sourceFile, File targetFile) {
if (sourceFile == null || targetFile == null) {
return false;
}
if (!sourceFile.exists()) {
return false;
}
if (!targetFile.exists()) {
targetFile.mkdirs();
}
// 获取目录下所有文件和文件夹的列表
File[] files = sourceFile.listFiles();
if (files == null || files.length < 1) {
return false;
}
File file = null;
StringBuffer buffer = new StringBuffer();
boolean isSuccessful = false;
// 遍历目录下的所有文件文件夹,分别处理
for (int i = 0; i < files.length; i++) {
file = files[i];
buffer.setLength(0);
buffer.append(targetFile.getAbsolutePath()).append(File.separator).append(file.getName());
if (file.isFile()) {
// 文件直接调用拷贝文件方法
isSuccessful = copyFile(file.getAbsolutePath(), buffer.toString());
if (!isSuccessful) {
return false;
}
} else if (file.isDirectory()) {
// 目录再次调用拷贝目录方法
copyDir(file, new File(buffer.toString()));
}
}
return true;
}
/**
* 剪切目录,先将目录拷贝完后再删除源目录
* @param sourceDir
* @param targetDir
* @return
*/
public static boolean cutDir(String sourceDir, String targetDir) {
File sourceFile = new File(sourceDir);
File targetFile = new File(targetDir);
boolean isCopySuccessful = copyDir(sourceFile, targetFile);
if (isCopySuccessful) {
return deleteDir(sourceDir);
}
return false;
}
/**
* 删除目录
* @param dir
* @return
*/
public static boolean deleteDir(String dir) {
File file = new File(dir);
if (!file.exists()) {
return false;
}
File[] files = file.listFiles();
boolean isSuccessful = false;
if (files.length == 0) {
file.delete();
return true;
}
// 对所有列表中的路径进行判断是文件还是文件夹
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
isSuccessful = deleteDir(files[i].getAbsolutePath());
} else if (files[i].isFile()) {
isSuccessful = deleteFile(files[i].getAbsolutePath());
}
if (!isSuccessful) {
// 如果有删除失败的情况直接跳出循环
break;
}
}
if (isSuccessful) {
file.delete();
}
return isSuccessful;
}
/**
*
* 将流写入指定文件
* @param inputStream
* @param path
* @return
*/
public static boolean stream2File(InputStream inputStream, String path) {
File file = new File(path);
boolean isSuccessful = true;
FileOutputStream fileOutputStream = null;
try {
if (!file.exists()) {
File file2 = file.getParentFile();
file2.mkdirs();
file.createNewFile();
}
fileOutputStream = new FileOutputStream(file);
byte[] bs = new byte[1024];
int length = 0;
while ((length = inputStream.read(bs)) != -1) {
fileOutputStream.write(bs, 0, length);
}
} catch (Exception e) {
Logger.i(TAG, e.getLocalizedMessage());
isSuccessful = false;
} finally {
try {
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (IOException e) {
Logger.i(TAG, e.getLocalizedMessage());
}
}
return isSuccessful;
}
/**
* 创建目录
* @param path
*/
public static void createDir(String path) {
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
}
/**
* 修改文件读写权限
* @param fileAbsPath
* @param mode
*/
public static void chmodFile(String fileAbsPath, String mode) {
String cmd = "chmod " + mode + " " + fileAbsPath;
try {
Runtime.getRuntime().exec(cmd);
} catch (Exception e) {
Logger.i(TAG, e.getLocalizedMessage());
}
}
/**
*
* 将object对象写入outFile文件
* @param outFile
* @param object
* @param context
*/
public static void writeObject2File(String outFile, Object object, Context context) {
ObjectOutputStream out = null;
FileOutputStream outStream = null;
try {
File dir = context.getDir("cache", Context.MODE_PRIVATE);
outStream = new FileOutputStream(new File(dir, outFile));
out = new ObjectOutputStream(new BufferedOutputStream(outStream));
out.writeObject(object);
out.flush();
} catch (Exception e) {
Logger.i(TAG, e.getLocalizedMessage());
} finally {
if (outStream != null) {
try {
outStream.close();
} catch (IOException e) {
Logger.i(TAG, e.getLocalizedMessage());
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
Logger.i(TAG, e.getLocalizedMessage());
}
}
}
}
/**
*
* 从outFile文件读取对象
* @param filePath
* @param context
* @return
*/
public static Object readObjectFromPath(String filePath, Context context) {
Object object = null;
ObjectInputStream in = null;
FileInputStream inputStream = null;
try {
File dir = context.getDir("cache", Context.MODE_PRIVATE);
File f = new File(dir, filePath);
if (f == null || !f.exists()) {
return null;
}
inputStream = new FileInputStream(new File(dir, filePath));
in = new ObjectInputStream(new BufferedInputStream(inputStream));
object = in.readObject();
} catch (Exception e) {
Logger.i(TAG, e.getLocalizedMessage());
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
Logger.i(TAG, e.getLocalizedMessage());
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
Logger.i(TAG, e.getLocalizedMessage());
}
}
}
return object;
}
/**
* 读取指定路径下的文件内容
* @param path
* @return 文件内容
*/
public static String readFile(String path) {
BufferedReader br = null;
try {
File myFile = new File(path);
br = new BufferedReader(new FileReader(myFile));
StringBuffer sb = new StringBuffer();
String line = br.readLine();
while (line != null) {
sb.append(line);
line = br.readLine();
}
return sb.toString();
} catch (Exception e) {
Logger.i(TAG, e.getLocalizedMessage());
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
Logger.i(TAG, e.getLocalizedMessage());
}
}
}
return null;
}
/**
* 创建文件,并修改读写权限
* @param filePath
* @param mode
* @return
*/
public static File createFile(String filePath, String mode) {
File desFile = null;
try {
String desDir = filePath.substring(0, filePath.lastIndexOf(File.separator));
File dir = new File(desDir);
if (!dir.exists()) {
dir.mkdirs();
}
chmodFile(dir.getAbsolutePath(), mode);
desFile = new File(filePath);
if (!desFile.exists()) {
desFile.createNewFile();
}
chmodFile(desFile.getAbsolutePath(), mode);
} catch (Exception e) {
Logger.i(TAG, e.getLocalizedMessage());
}
return desFile;
}
/**
* 根据指定路径,创建父目录及文件
* @param filePath
* @return File 如果创建失败的话,返回null
*/
public static File createFile(String filePath) {
return createFile(filePath, "755");
}
/**
* 获取系统存储路径
* @return
*/
public static String getRootDirectoryPath() {
return Environment.getRootDirectory().getAbsolutePath();
}
/**
* 获取外部存储路径
* @return
*/
public static String getExternalStorageDirectoryPath() {
return Environment.getExternalStorageDirectory().getPath();
}
}
