Android开发中的文件操作工具类FileUtil完整实例
更新时间:2017年11月13日 09:43:44 作者:LovooGod
这篇文章主要介绍了Android开发中的文件操作工具类FileUtil,结合完整实例形式分析了Android文件操作的常用技巧,包括文件的获取、遍历、搜索、复制、删除、判断等功能,需要的朋友可以参考下
本文实例讲述了Android开发中的文件操作工具类FileUtil。分享给大家供大家参考,具体如下:
package com.ymerp.android.tools; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.LineNumberReader; import java.io.OutputStream; import java.io.Reader; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.os.Environment; import android.util.Log; import android.widget.Toast; /** * 文件操作工具 * * @author chen.lin * */ public class FileUtil { private static final String TAG = "FileUtil"; /** * 从sd卡取文件 * * @param filename * @return */ public String getFileFromSdcard(String filename) { ByteArrayOutputStream outputStream = null; FileInputStream fis = null; try { outputStream = new ByteArrayOutputStream(); File file = new File(Environment.getExternalStorageDirectory(), filename); if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { fis = new FileInputStream(file); int len = 0; byte[] data = new byte[1024]; while ((len = fis.read(data)) != -1) { outputStream.write(data, 0, len); } } } catch (Exception e) { e.printStackTrace(); } finally { try { outputStream.close(); fis.close(); } catch (IOException e) { } } return new String(outputStream.toByteArray()); } /** * 保存文件到sd * * @param filename * @param content * @return */ public static boolean saveContentToSdcard(String filename, String content) { boolean flag = false; FileOutputStream fos = null; try { File file = new File(Environment.getExternalStorageDirectory(), filename); if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { fos = new FileOutputStream(file); fos.write(content.getBytes()); flag = true; } } catch (Exception e) { e.printStackTrace(); flag = false; } finally { try { fos.close(); } catch (IOException e) { } } return flag; } /** * 取得文件大小 * * @param f * @return * @throws Exception */ @SuppressWarnings("resource") public static long getFileSizes(File f) throws Exception { long size = 0; if (f.exists()) { FileInputStream fis = null; fis = new FileInputStream(f); size = fis.available(); } else { f.createNewFile(); } return size; } /** * 递归取得文件夹大小 * * @param dir * @return * @throws Exception */ public static long getFileSize(File dir) throws Exception { long size = 0; File flist[] = dir.listFiles(); for (int i = 0; i < flist.length; i++) { if (flist[i].isDirectory()) { size = size + getFileSize(flist[i]); } else { size = size + flist[i].length(); } } return size; } /** * 转换文件大小 * * @param fileS * @return */ public static String FormetFileSize(long fileS) { DecimalFormat df = new DecimalFormat("#.00"); String fileSizeString = ""; if (fileS < 1024) { fileSizeString = df.format((double) fileS) + "B"; } else if (fileS < 1048576) { fileSizeString = df.format((double) fileS / 1024) + "K"; } else if (fileS < 1073741824) { fileSizeString = df.format((double) fileS / 1048576) + "M"; } else { fileSizeString = df.format((double) fileS / 1073741824) + "G"; } return fileSizeString; } /** * 递归求取目录文件个数 * * @param f * @return */ public static long getlist(File f) { long size = 0; File flist[] = f.listFiles(); size = flist.length; for (int i = 0; i < flist.length; i++) { if (flist[i].isDirectory()) { size = size + getlist(flist[i]); size--; } } return size; } /** * 在根目录下搜索文件 * * @param keyword * @return */ public static String searchFile(String keyword) { String result = ""; File[] files = new File("/").listFiles(); for (File file : files) { if (file.getName().indexOf(keyword) >= 0) { result += file.getPath() + "\n"; } } if (result.equals("")) { result = "找不到文件!!"; } return result; } /** * @detail 搜索sdcard文件 * @param 需要进行文件搜索的目录 * @param 过滤搜索文件类型 * */ public static List<String> search(File file, String[] ext) { List<String> list = new ArrayList<String>(); if (file != null) { if (file.isDirectory()) { File[] listFile = file.listFiles(); if (listFile != null) { for (int i = 0; i < listFile.length; i++) { search(listFile[i], ext); } } } else { String filename = file.getAbsolutePath(); for (int i = 0; i < ext.length; i++) { if (filename.endsWith(ext[i])) { list.add(filename); break; } } } } return list; } /** * 查询文件 * * @param file * @param keyword * @return */ public static List<File> FindFile(File file, String keyword) { List<File> list = new ArrayList<File>(); if (file.isDirectory()) { File[] files = file.listFiles(); if (files != null) { for (File tempf : files) { if (tempf.isDirectory()) { if (tempf.getName().toLowerCase().lastIndexOf(keyword) > -1) { list.add(tempf); } list.addAll(FindFile(tempf, keyword)); } else { if (tempf.getName().toLowerCase().lastIndexOf(keyword) > -1) { list.add(tempf); } } } } } return list; } /** * searchFile 查找文件并加入到ArrayList 当中去 * * @param context * @param keyword * @param filepath * @return */ public static List<Map<String, Object>> searchFile(Context context, String keyword, File filepath) { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); Map<String, Object> rowItem = null; int index = 0; // 判断SD卡是否存在 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { File[] files = filepath.listFiles(); if (files.length > 0) { for (File file : files) { if (file.isDirectory()) { if (file.getName().toLowerCase().lastIndexOf(keyword) > -1) { rowItem = new HashMap<String, Object>(); rowItem.put("number", index); // 加入序列号 rowItem.put("fileName", file.getName());// 加入名称 rowItem.put("path", file.getPath()); // 加入路径 rowItem.put("size", file.length() + ""); // 加入文件大小 list.add(rowItem); } // 如果目录可读就执行(一定要加,不然会挂掉) if (file.canRead()) { list.addAll(searchFile(context, keyword, file)); // 如果是目录,递归查找 } } else { // 判断是文件,则进行文件名判断 try { if (file.getName().indexOf(keyword) > -1 || file.getName().indexOf(keyword.toUpperCase()) > -1) { rowItem = new HashMap<String, Object>(); rowItem.put("number", index); // 加入序列号 rowItem.put("fileName", file.getName());// 加入名称 rowItem.put("path", file.getPath()); // 加入路径 rowItem.put("size", file.length() + ""); // 加入文件大小 list.add(rowItem); index++; } } catch (Exception e) { Toast.makeText(context, "查找发生错误!", Toast.LENGTH_SHORT).show(); } } } } } return list; } /** * 根据后缀得到文件类型 * * @param fileName * @param pointIndex * @return */ public static String getFileType(String fileName, int pointIndex) { String type = fileName.substring(pointIndex + 1).toLowerCase(); if ("m4a".equalsIgnoreCase(type) || "xmf".equalsIgnoreCase(type) || "ogg".equalsIgnoreCase(type) || "wav".equalsIgnoreCase(type) || "m4a".equalsIgnoreCase(type) || "aiff".equalsIgnoreCase(type) || "midi".equalsIgnoreCase(type) || "vqf".equalsIgnoreCase(type) || "aac".equalsIgnoreCase(type) || "flac".equalsIgnoreCase(type) || "tak".equalsIgnoreCase(type) || "wv".equalsIgnoreCase(type)) { type = "ic_file_audio"; } else if ("mp3".equalsIgnoreCase(type) || "mid".equalsIgnoreCase(type)) { type = "ic_file_mp3"; } else if ("avi".equalsIgnoreCase(type) || "mp4".equalsIgnoreCase(type) || "dvd".equalsIgnoreCase(type) || "mid".equalsIgnoreCase(type) || "mov".equalsIgnoreCase(type) || "mkv".equalsIgnoreCase(type) || "mp2v".equalsIgnoreCase(type) || "mpe".equalsIgnoreCase(type) || "mpeg".equalsIgnoreCase(type) || "mpg".equalsIgnoreCase(type) || "asx".equalsIgnoreCase(type) || "asf".equalsIgnoreCase(type) || "flv".equalsIgnoreCase(type) || "navi".equalsIgnoreCase(type) || "divx".equalsIgnoreCase(type) || "rm".equalsIgnoreCase(type) || "rmvb".equalsIgnoreCase(type) || "dat".equalsIgnoreCase(type) || "mpa".equalsIgnoreCase(type) || "vob".equalsIgnoreCase(type) || "3gp".equalsIgnoreCase(type) || "swf".equalsIgnoreCase(type) || "wmv".equalsIgnoreCase(type)) { type = "ic_file_video"; } else if ("bmp".equalsIgnoreCase(type) || "pcx".equalsIgnoreCase(type) || "tiff".equalsIgnoreCase(type) || "gif".equalsIgnoreCase(type) || "jpeg".equalsIgnoreCase(type) || "tga".equalsIgnoreCase(type) || "exif".equalsIgnoreCase(type) || "fpx".equalsIgnoreCase(type) || "psd".equalsIgnoreCase(type) || "cdr".equalsIgnoreCase(type) || "raw".equalsIgnoreCase(type) || "eps".equalsIgnoreCase(type) || "gif".equalsIgnoreCase(type) || "jpg".equalsIgnoreCase(type) || "jpeg".equalsIgnoreCase(type) || "png".equalsIgnoreCase(type) || "hdri".equalsIgnoreCase(type) || "ai".equalsIgnoreCase(type)) { type = "ic_file_image"; } else if ("ppt".equalsIgnoreCase(type) || "doc".equalsIgnoreCase(type) || "xls".equalsIgnoreCase(type) || "pps".equalsIgnoreCase(type) || "xlsx".equalsIgnoreCase(type) || "xlsm".equalsIgnoreCase(type) || "pptx".equalsIgnoreCase(type) || "pptm".equalsIgnoreCase(type) || "ppsx".equalsIgnoreCase(type) || "maw".equalsIgnoreCase(type) || "mdb".equalsIgnoreCase(type) || "pot".equalsIgnoreCase(type) || "msg".equalsIgnoreCase(type) || "oft".equalsIgnoreCase(type) || "xlw".equalsIgnoreCase(type) || "wps".equalsIgnoreCase(type) || "rtf".equalsIgnoreCase(type) || "ppsm".equalsIgnoreCase(type) || "potx".equalsIgnoreCase(type) || "potm".equalsIgnoreCase(type) || "ppam".equalsIgnoreCase(type)) { type = "ic_file_office"; } else if ("txt".equalsIgnoreCase(type) || "text".equalsIgnoreCase(type) || "chm".equalsIgnoreCase(type) || "hlp".equalsIgnoreCase(type) || "pdf".equalsIgnoreCase(type) || "doc".equalsIgnoreCase(type) || "docx".equalsIgnoreCase(type) || "docm".equalsIgnoreCase(type) || "dotx".equalsIgnoreCase(type)) { type = "ic_file_text"; } else if ("ini".equalsIgnoreCase(type) || "sys".equalsIgnoreCase(type) || "dll".equalsIgnoreCase(type) || "adt".equalsIgnoreCase(type)) { type = "ic_file_system"; } else if ("rar".equalsIgnoreCase(type) || "zip".equalsIgnoreCase(type) || "arj".equalsIgnoreCase(type) || "gz".equalsIgnoreCase(type) || "z".equalsIgnoreCase(type) || "7Z".equalsIgnoreCase(type) || "GZ".equalsIgnoreCase(type) || "BZ".equalsIgnoreCase(type) || "ZPAQ".equalsIgnoreCase(type)) { type = "ic_file_rar"; } else if ("html".equalsIgnoreCase(type) || "htm".equalsIgnoreCase(type) || "java".equalsIgnoreCase(type) || "php".equalsIgnoreCase(type) || "asp".equalsIgnoreCase(type) || "aspx".equalsIgnoreCase(type) || "jsp".equalsIgnoreCase(type) || "shtml".equalsIgnoreCase(type) || "xml".equalsIgnoreCase(type)) { type = "ic_file_web"; } else if ("exe".equalsIgnoreCase(type) || "com".equalsIgnoreCase(type) || "bat".equalsIgnoreCase(type) || "iso".equalsIgnoreCase(type) || "msi".equalsIgnoreCase(type)) { type = "ic_file_exe"; } else if ("apk".equalsIgnoreCase(type)) { type = "ic_file_apk"; } else { type = "ic_file_normal"; } return type; } /** * 改变文件大小显示的内容 * * @param size * @return */ public static String changeFileSize(String size) { if (Integer.parseInt(size) > 1024) { size = Integer.parseInt(size) / 1024 + "K"; } else if (Integer.parseInt(size) > (1024 * 1024)) { size = Integer.parseInt(size) / (1024 * 1024) + "M"; } else if (Integer.parseInt(size) > (1024 * 1024 * 1024)) { size = Integer.parseInt(size) / (1024 * 1024 * 1024) + "G"; } else { size += "B"; } return size; } /** * 得到所有文件 * * @param dir * @return */ public static ArrayList<File> getAllFiles(File dir) { ArrayList<File> allFiles = new ArrayList<File>(); // 递归取得目录下的所有文件及文件夹 File[] files = dir.listFiles(); for (int i = 0; i < files.length; i++) { File file = files[i]; allFiles.add(file); if (file.isDirectory()) { getAllFiles(file); } } Logger.i("test", allFiles.size() + ""); return allFiles; } /** * 判断文件MimeType 类型 * * @param f * @return */ public static String getMIMEType(File f) { String type = ""; String fName = f.getName(); /* 取得扩展名 */ String end = fName.substring(fName.lastIndexOf(".") + 1, fName.length()).toLowerCase(); /* 依扩展名的类型决定MimeType */ if (end.equalsIgnoreCase("m4a") || end.equalsIgnoreCase("mp3") || end.equalsIgnoreCase("mid") || end.equalsIgnoreCase("xmf") || end.equalsIgnoreCase("ogg") || end.equalsIgnoreCase("wav")) { type = "audio"; } else if (end.equalsIgnoreCase("3gp") || end.equalsIgnoreCase("mp4")) { type = "video"; } else if (end.equalsIgnoreCase("jpg") || end.equalsIgnoreCase("gif") || end.equalsIgnoreCase("png") || end.equalsIgnoreCase("jpeg") || end.equalsIgnoreCase("bmp")) { type = "image"; } else if (end.equalsIgnoreCase("apk")) { /* android.permission.INSTALL_PACKAGES */ type = "application/vnd.android.package-archive"; } else if (end.equalsIgnoreCase("txt") || end.equalsIgnoreCase("java")) { /* android.permission.INSTALL_PACKAGES */ type = "text"; } else { type = "*"; } /* 如果无法直接打开,就跳出软件列表给用户选择 */ if (end.equalsIgnoreCase("apk")) { } else { type += "/*"; } return type; } /** * 拷贝文件 * * @param fromFile * @param toFile * @throws IOException */ public static void copyFile(File fromFile, String toFile) throws IOException { FileInputStream from = null; FileOutputStream to = null; try { from = new FileInputStream(fromFile); to = new FileOutputStream(toFile); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = from.read(buffer)) != -1) to.write(buffer, 0, bytesRead); // write } finally { if (from != null) try { from.close(); } catch (IOException e) { Log.e(TAG, "", e); } if (to != null) try { to.close(); } catch (IOException e) { Log.e(TAG, "", e); } } } /** * 创建文件 * * @param file * @return */ public static File createNewFile(File file) { try { if (file.exists()) { return file; } File dir = file.getParentFile(); if (!dir.exists()) { dir.mkdirs(); } if (!file.exists()) { file.createNewFile(); } } catch (IOException e) { Log.e(TAG, "", e); return null; } return file; } /** * 创建文件 * * @param path */ public static File createNewFile(String path) { File file = new File(path); return createNewFile(file); }// end method createText() /** * 删除文件 * * @param path */ public static void deleteFile(String path) { File file = new File(path); deleteFile(file); } /** * 删除文件 * * @param file */ public static void deleteFile(File file) { if (!file.exists()) { return; } if (file.isFile()) { file.delete(); } else if (file.isDirectory()) { File files[] = file.listFiles(); for (int i = 0; i < files.length; i++) { deleteFile(files[i]); } } file.delete(); } /** * 向Text文件中写入内容 * * @param file * @param content * @return */ public static boolean write(String path, String content) { return write(path, content, false); } public static boolean write(String path, String content, boolean append) { return write(new File(path), content, append); } public static boolean write(File file, String content) { return write(file, content, false); } /** * 写入文件 * * @param file * @param content * @param append * @return */ public static boolean write(File file, String content, boolean append) { if (file == null || StringUtil.empty(content)) { return false; } if (!file.exists()) { file = createNewFile(file); } FileOutputStream fos = null; try { fos = new FileOutputStream(file, append); fos.write(content.getBytes()); } catch (Exception e) { Log.e(TAG, "", e); return false; } finally { try { fos.close(); } catch (IOException e) { Log.e(TAG, "", e); } fos = null; } return true; } /** * 获得文件名 * * @param path * @return */ public static String getFileName(String path) { if (StringUtil.empty(path)) { return null; } File f = new File(path); String name = f.getName(); f = null; return name; } /** * 读取文件内容,从第startLine行开始,读取lineCount行 * * @param file * @param startLine * @param lineCount * @return 读到文字的list,如果list.size<lineCount则说明读到文件末尾了 */ public static List<String> readFile(File file, int startLine, int lineCount) { if (file == null || startLine < 1 || lineCount < 1) { return null; } if (!file.exists()) { return null; } FileReader fileReader = null; List<String> list = null; try { list = new ArrayList<String>(); fileReader = new FileReader(file); LineNumberReader lineReader = new LineNumberReader(fileReader); boolean end = false; for (int i = 1; i < startLine; i++) { if (lineReader.readLine() == null) { end = true; break; } } if (end == false) { for (int i = startLine; i < startLine + lineCount; i++) { String line = lineReader.readLine(); if (line == null) { break; } list.add(line); } } } catch (Exception e) { Log.e(TAG, "read log error!", e); } finally { if (fileReader != null) { try { fileReader.close(); } catch (IOException e) { e.printStackTrace(); } } } return list; } /** * 创建文件夹 * * @param dir * @return */ public static boolean createDir(File dir) { try { if (!dir.exists()) { dir.mkdirs(); } return true; } catch (Exception e) { Log.e(TAG, "create dir error", e); return false; } } /** * 在SD卡上创建目录 * * @param dirName */ public static File creatSDDir(String dirName) { File dir = new File(dirName); dir.mkdir(); return dir; } /** * 判断SD卡上的文件是否存在 */ public static boolean isFileExist(String fileName) { File file = new File(fileName); return file.exists(); } /** * 将一个InputStream里面的数据写入到SD卡中 */ public static File write2SDFromInput(String path, String fileName, InputStream input) { File file = null; OutputStream output = null; try { creatSDDir(path); file = createNewFile(path + "/" + fileName); output = new FileOutputStream(file); byte buffer[] = new byte[1024]; int len = -1; while ((len = input.read(buffer)) != -1) { output.write(buffer, 0, len); } output.flush(); } catch (Exception e) { e.printStackTrace(); } finally { try { output.close(); } catch (Exception e) { e.printStackTrace(); } } return file; } /** * 读取文件内容 从文件中一行一行的读取文件 * * @param file * @return */ public static String readFile(File file) { Reader read = null; String content = ""; String result = ""; BufferedReader br = null; try { read = new FileReader(file); br = new BufferedReader(read); while ((content = br.readLine().toString().trim()) != null) { result += content + "\r\n"; } } catch (Exception e) { e.printStackTrace(); } finally { try { read.close(); br.close(); } catch (Exception e) { e.printStackTrace(); } } return result; } /** * 将图片保存到本地时进行压缩, 即将图片从Bitmap形式变为File形式时进行压缩, * 特点是: File形式的图片确实被压缩了, 但是当你重新读取压缩后的file为 Bitmap是,它占用的内存并没有改变 * * @param bmp * @param file */ public static void compressBmpToFile(Bitmap bmp, File file) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); int options = 80;// 个人喜欢从80开始, bmp.compress(Bitmap.CompressFormat.JPEG, options, baos); while (baos.toByteArray().length / 1024 > 100) { baos.reset(); options -= 10; bmp.compress(Bitmap.CompressFormat.JPEG, options, baos); } try { FileOutputStream fos = new FileOutputStream(file); fos.write(baos.toByteArray()); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 将图片从本地读到内存时,进行压缩 ,即图片从File形式变为Bitmap形式 * 特点: 通过设置采样率, 减少图片的像素, 达到对内存中的Bitmap进行压缩 * @param srcPath * @return */ public static Bitmap compressImageFromFile(String srcPath, float pixWidth, float pixHeight) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true;// 只读边,不读内容 Bitmap bitmap = BitmapFactory.decodeFile(srcPath, options); options.inJustDecodeBounds = false; int w = options.outWidth; int h = options.outHeight; //float pixWidth = 800f;// //float pixHeight = 480f;// int scale = 1; if (w > h && w > pixWidth) { scale = (int) (options.outWidth / pixWidth); } else if (w < h && h > pixHeight) { scale = (int) (options.outHeight / pixHeight); } if (scale <= 0) scale = 1; options.inSampleSize = scale;// 设置采样率 options.inPreferredConfig = Config.ARGB_8888;// 该模式是默认的,可不设 options.inPurgeable = true;// 同时设置才会有效 options.inInputShareable = true;// 。当系统内存不够时候图片自动被回收 bitmap = BitmapFactory.decodeFile(srcPath, options); // return compressBmpFromBmp(bitmap);//原来的方法调用了这个方法企图进行二次压缩 // 其实是无效的,大家尽管尝试 return bitmap; } /** * 指定分辨率和清晰度的图片压缩 */ public void transImage(String fromFile, String toFile, int width, int height, int quality) { try { Bitmap bitmap = BitmapFactory.decodeFile(fromFile); int bitmapWidth = bitmap.getWidth(); int bitmapHeight = bitmap.getHeight(); // 缩放图片的尺寸 float scaleWidth = (float) width / bitmapWidth; float scaleHeight = (float) height / bitmapHeight; Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); // 产生缩放后的Bitmap对象 Bitmap resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmapWidth, bitmapHeight, matrix, false); // save file File myCaptureFile = new File(toFile); FileOutputStream out = new FileOutputStream(myCaptureFile); if(resizeBitmap.compress(Bitmap.CompressFormat.JPEG, quality, out)){ out.flush(); out.close(); } if(!bitmap.isRecycled()){ bitmap.recycle();//记得释放资源,否则会内存溢出 } if(!resizeBitmap.isRecycled()){ resizeBitmap.recycle(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } } }
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android文件操作技巧汇总》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android布局layout技巧总结》、《Android开发入门与进阶教程》、《Android资源操作技巧汇总》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。
您可能感兴趣的文章:
相关文章
Android 给图片加上水印的示例代码(支持logo+文字)
本篇文章主要介绍了Android 给图片加上水印的示例代码(支持logo+文字),具有一定的参考价值,有兴趣的可以了解一下2017-08-08Android ViewPager无限循环实现底部小圆点动态滑动
这篇文章主要为大家详细介绍了Android ViewPager无限循环实现底部小圆点动态滑动的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2016-03-03
最新评论