package com.jingewenku.abrahamcaijin.commonutil; import android.content.Context; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.os.Environment; import android.os.StatFs; import android.util.Log; import com.jingewenku.abrahamcaijin.commonutil.klog.KLog; import java.io.*; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; /** * @Description:主要功能:文件管理 * @Prject: CommonUtilLibrary * @Package: com.jingewenku.abrahamcaijin.commonutil * @author: AbrahamCaiJin * @date: 2017年05月16日 15:30 * @Copyright: 个人版权所有 * @Company: * @version: 1.0.0 */ public class FileUtils { private FileUtils() { throw new UnsupportedOperationException("cannot be instantiated"); } private static final String TAG = FileUtils.class.getSimpleName(); /** * 创建目录 * * @param context * @param dirName 文件夹名称 * @return */ public static File createFileDir(Context context, String dirName) { String filePath; // 如SD卡已存在,则存储;反之存在data目录下 if (isMountedSDCard()) { // SD卡路径 filePath = Environment.getExternalStorageDirectory() + File.separator + dirName; } else { filePath = context.getCacheDir().getPath() + File.separator + dirName; } File destDir = new File(filePath); if (!destDir.exists()) { boolean isCreate = destDir.mkdirs(); Log.i("FileUtils", filePath + " has created. " + isCreate); } return destDir; } /** * 删除文件(若为目录,则递归删除子目录和文件) * * @param file * @param delThisPath true代表删除参数指定file,false代表保留参数指定file */ public static void delFile(File file, boolean delThisPath) { if (!file.exists()) { return; } if (file.isDirectory()) { File[] subFiles = file.listFiles(); if (subFiles != null) { int num = subFiles.length; // 删除子目录和文件 for (int i = 0; i < num; i++) { delFile(subFiles[i], true); } } } if (delThisPath) { file.delete(); } } /** * 获取文件大小,单位为byte(若为目录,则包括所有子目录和文件) * * @param file * @return */ public static long getFileSize(File file) { long size = 0; if (file.exists()) { if (file.isDirectory()) { File[] subFiles = file.listFiles(); if (subFiles != null) { int num = subFiles.length; for (int i = 0; i < num; i++) { size += getFileSize(subFiles[i]); } } } else { size += file.length(); } } return size; } /** * 保存Bitmap到指定目录 * * @param dir 目录 * @param fileName 文件名 * @param bitmap * @throws IOException */ public static void saveBitmap(File dir, String fileName, Bitmap bitmap) { if (bitmap == null) { return; } File file = new File(dir, fileName); try { file.createNewFile(); FileOutputStream fos = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } /** * 判断某目录下文件是否存在 * * @param dir 目录 * @param fileName 文件名 * @return */ public static boolean isFileExists(File dir, String fileName) { return new File(dir, fileName).exists(); } /** * 检查是否已挂载SD卡镜像(是否存在SD卡) * * @return */ public static boolean isMountedSDCard() { if (Environment.MEDIA_MOUNTED.equals(Environment .getExternalStorageState())) { return true; } else { KLog.w(TAG, "SDCARD is not MOUNTED !"); return false; } } /** * 获取SD卡剩余容量(单位Byte) * * @return */ @SuppressWarnings("deprecation") public static long gainSDFreeSize() { if (isMountedSDCard()) { // 取得SD卡文件路径 File path = Environment.getExternalStorageDirectory(); StatFs sf = new StatFs(path.getPath()); // 获取单个数据块的大小(Byte) long blockSize = sf.getBlockSize(); // 空闲的数据块的数量 long freeBlocks = sf.getAvailableBlocks(); // 返回SD卡空闲大小 return freeBlocks * blockSize; // 单位Byte } else { return 0; } } /** * 获取SD卡总容量(单位Byte) * * @return */ @SuppressWarnings("deprecation") public static long gainSDAllSize() { if (isMountedSDCard()) { // 取得SD卡文件路径 File path = Environment.getExternalStorageDirectory(); StatFs sf = new StatFs(path.getPath()); // 获取单个数据块的大小(Byte) long blockSize = sf.getBlockSize(); // 获取所有数据块数 long allBlocks = sf.getBlockCount(); // 返回SD卡大小(Byte) return allBlocks * blockSize; } else { return 0; } } /** * 获取可用的SD卡路径(若SD卡不没有挂载则返回"") * * @return */ public static String gainSDCardPath() { if (isMountedSDCard()) { File sdcardDir = Environment.getExternalStorageDirectory(); if (!sdcardDir.canWrite()) { KLog.w(TAG, "SDCARD can not write !"); } return sdcardDir.getPath(); } return ""; } /** * 以行为单位读取文件内容,一次读一整行,常用于读面向行的格式化文件 * * @param filePath * 文件路径 */ public static String readFileByLines(String filePath) throws IOException { BufferedReader reader = null; StringBuffer sb = new StringBuffer(); try { reader = new BufferedReader(new InputStreamReader( new FileInputStream(filePath), System.getProperty("file.encoding"))); String tempString = null; while ((tempString = reader.readLine()) != null) { sb.append(tempString); sb.append("\n"); } reader.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { reader.close(); } } return sb.toString(); } /** * 以行为单位读取文件内容,一次读一整行,常用于读面向行的格式化文件 * * @param filePath * 文件路径 * @param encoding * 写文件编码 */ public static String readFileByLines(String filePath, String encoding) throws IOException { BufferedReader reader = null; StringBuffer sb = new StringBuffer(); try { reader = new BufferedReader(new InputStreamReader( new FileInputStream(filePath), encoding)); String tempString = null; while ((tempString = reader.readLine()) != null) { sb.append(tempString); sb.append("\n"); } reader.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { reader.close(); } } return sb.toString(); } /** * 保存内容 * * @param filePath * 文件路径 * @param content * 保存的内容 * @throws IOException */ public static void saveToFile(String filePath, String content) throws IOException { saveToFile(filePath, content, System.getProperty("file.encoding")); } /** * 指定编码保存内容 * * @param filePath * 文件路径 * @param content * 保存的内容 * @param encoding * 写文件编码 * @throws IOException */ public static void saveToFile(String filePath, String content, String encoding) throws IOException { BufferedWriter writer = null; File file = new File(filePath); try { if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } writer = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(file, false), encoding)); writer.write(content); } finally { if (writer != null) { writer.close(); } } } /** * 追加文本 * * @param content * 需要追加的内容 * @param file * 待追加文件源 * @throws IOException */ public static void appendToFile(String content, File file) throws IOException { appendToFile(content, file, System.getProperty("file.encoding")); } /** * 追加文本 * * @param content * 需要追加的内容 * @param file * 待追加文件源 * @param encoding * 文件编码 * @throws IOException */ public static void appendToFile(String content, File file, String encoding) throws IOException { BufferedWriter writer = null; try { if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } writer = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(file, true), encoding)); writer.write(content); } finally { if (writer != null) { writer.close(); } } } /** * 判断文件是否存在 * * @param filePath * 文件路径 * @return 是否存在 * @throws Exception */ public static Boolean isExsit(String filePath) { Boolean flag = false; try { File file = new File(filePath); if (file.exists()) { flag = true; } } catch (Exception e) { KLog.e("判断文件失败-->" + e.getMessage()); } return flag; } /** * 快速读取程序应用包下的文件内容 * * @param context * 上下文 * @param filename * 文件名称 * @return 文件内容 * @throws IOException */ public static String read(Context context, String filename) throws IOException { FileInputStream inStream = context.openFileInput(filename); ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inStream.read(buffer)) != -1) { outStream.write(buffer, 0, len); } byte[] data = outStream.toByteArray(); return new String(data); } /** * 读取指定目录文件的文件内容 * * @param fileName * 文件名称 * @return 文件内容 * @throws Exception */ @SuppressWarnings("resource") public static String read(String fileName) throws IOException { FileInputStream inStream = new FileInputStream(fileName); ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inStream.read(buffer)) != -1) { outStream.write(buffer, 0, len); } byte[] data = outStream.toByteArray(); return new String(data); } /*** * 以行为单位读取文件内容,一次读一整行,常用于读面向行的格式化文件 * * @param fileName * 文件名称 * @param encoding * 文件编码 * @return 字符串内容 * @throws IOException */ public static String read(String fileName, String encoding) throws IOException { BufferedReader reader = null; StringBuffer sb = new StringBuffer(); try { reader = new BufferedReader(new InputStreamReader( new FileInputStream(fileName), encoding)); String tempString = null; while ((tempString = reader.readLine()) != null) { sb.append(tempString); } } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { reader.close(); } } return sb.toString(); } /** * 读取raw目录的文件内容 * * @param context * 内容上下文 * @param rawFileId * raw文件名id * @return */ public static String readRawValue(Context context, int rawFileId) { String result = ""; try { InputStream is = context.getResources().openRawResource(rawFileId); int len = is.available(); byte[] buffer = new byte[len]; is.read(buffer); result = new String(buffer, "UTF-8"); is.close(); } catch (Exception e) { e.printStackTrace(); } return result; } /** * 读取assets目录的文件内容 * * @param context * 内容上下文 * @param fileName * 文件名称,包含扩展名 * @return */ public static String readAssetsValue(Context context, String fileName) { String result = ""; try { InputStream is = context.getResources().getAssets().open(fileName); int len = is.available(); byte[] buffer = new byte[len]; is.read(buffer); result = new String(buffer, "UTF-8"); is.close(); } catch (Exception e) { e.printStackTrace(); } return result; } /** * 读取assets目录的文件内容 * * @param context * 内容上下文 * @param fileName * 文件名称,包含扩展名 * @return */ public static List<String> readAssetsListValue(Context context, String fileName) { List<String> list = new ArrayList<String>(); try { InputStream in = context.getResources().getAssets().open(fileName); BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8")); String str = null; while ((str = br.readLine()) != null) { list.add(str); } } catch (IOException e) { e.printStackTrace(); } return list; } /** * 获取SharedPreferences文件内容 * * @param context * 上下文 * @param fileNameNoExt * 文件名称(不用带后缀名) * @return */ public static Map<String, ?> readShrePerface(Context context, String fileNameNoExt) { SharedPreferences preferences = context.getSharedPreferences( fileNameNoExt, Context.MODE_PRIVATE); return preferences.getAll(); } /** * 写入SharedPreferences文件内容 * * @param context * 上下文 * @param fileNameNoExt * 文件名称(不用带后缀名) * @param values * 需要写入的数据Map(String,Boolean,Float,Long,Integer) * @return */ @SuppressWarnings({ "unchecked", "rawtypes" }) public static void writeShrePerface(Context context, String fileNameNoExt, Map<String, ?> values) { try { SharedPreferences preferences = context.getSharedPreferences( fileNameNoExt, Context.MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); for (Iterator iterator = values.entrySet().iterator(); iterator .hasNext();) { Map.Entry<String, ?> entry = (Map.Entry<String, ?>) iterator .next(); if (entry.getValue() instanceof String) { editor.putString(entry.getKey(), (String) entry.getValue()); } else if (entry.getValue() instanceof Boolean) { editor.putBoolean(entry.getKey(), (Boolean) entry.getValue()); } else if (entry.getValue() instanceof Float) { editor.putFloat(entry.getKey(), (Float) entry.getValue()); } else if (entry.getValue() instanceof Long) { editor.putLong(entry.getKey(), (Long) entry.getValue()); } else if (entry.getValue() instanceof Integer) { editor.putInt(entry.getKey(), (Integer) entry.getValue()); } } editor.commit(); } catch (Exception e) { e.printStackTrace(); } } /** * 写入应用程序包files目录下文件 * * @param context * 上下文 * @param fileName * 文件名称 * @param content * 文件内容 */ public static void write(Context context, String fileName, String content) { try { FileOutputStream outStream = context.openFileOutput(fileName, Context.MODE_PRIVATE); outStream.write(content.getBytes()); outStream.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 写入应用程序包files目录下文件 * * @param context * 上下文 * @param fileName * 文件名称 * @param content * 文件内容 */ public static void write(Context context, String fileName, byte[] content) { try { FileOutputStream outStream = context.openFileOutput(fileName, Context.MODE_PRIVATE); outStream.write(content); outStream.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 写入应用程序包files目录下文件 * * @param context * 上下文 * @param fileName * 文件名称 * @param modeType * 文件写入模式(Context.MODE_PRIVATE、Context.MODE_APPEND、Context. * MODE_WORLD_READABLE、Context.MODE_WORLD_WRITEABLE) * @param content * 文件内容 */ public static void write(Context context, String fileName, byte[] content, int modeType) { try { FileOutputStream outStream = context.openFileOutput(fileName, modeType); outStream.write(content); outStream.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 指定编码将内容写入目标文件 * * @param target * 目标文件 * @param content * 文件内容 * @param encoding * 写入文件编码 * @throws Exception */ public static void write(File target, String content, String encoding) throws IOException { BufferedWriter writer = null; try { if (!target.getParentFile().exists()) { target.getParentFile().mkdirs(); } writer = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(target, false), encoding)); writer.write(content); } finally { if (writer != null) { writer.close(); } } } /** * 指定目录写入文件内容 * * @param filePath * 文件路径+文件名 * @param content * 文件内容 * @throws IOException */ public static void write(String filePath, byte[] content) throws IOException { FileOutputStream fos = null; try { File file = new File(filePath); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } fos = new FileOutputStream(file); fos.write(content); fos.flush(); } finally { if (fos != null) { fos.close(); } } } /** * 写入文件 * * @param inputStream 下载文件的字节流对象 * @param filePath 文件的存放路径 * (带文件名称) * @throws IOException */ public static File write(InputStream inputStream, String filePath) throws IOException { OutputStream outputStream = null; // 在指定目录创建一个空文件并获取文件对象 File mFile = new File(filePath); if (!mFile.getParentFile().exists()) mFile.getParentFile().mkdirs(); try { outputStream = new FileOutputStream(mFile); byte buffer[] = new byte[4 * 1024]; int lenght = 0; while ((lenght = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, lenght); } outputStream.flush(); return mFile; } catch (IOException e) { KLog.e(TAG, "写入文件失败,原因:" + e.getMessage()); throw e; } finally { try { inputStream.close(); if (outputStream != null) { outputStream.close(); outputStream = null; } } catch (IOException e) { } } } /** * 指定目录写入文件内容 * * @param filePath * 文件路径+文件名 * @param bitmap * 文件内容 * @throws IOException */ public static void saveAsJPEG(Bitmap bitmap, String filePath) throws IOException { FileOutputStream fos = null; try { File file = new File(filePath); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } fos = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); } finally { if (fos != null) { fos.close(); } } } /** * 指定目录写入文件内容 * * @param filePath * 文件路径+文件名 * @param bitmap * 文件内容 * @throws IOException */ public static void saveAsPNG(Bitmap bitmap, String filePath) throws IOException { FileOutputStream fos = null; try { File file = new File(filePath); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } fos = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); } finally { if (fos != null) { fos.close(); } } } }