Android FileUtil

转载请注明出处:https://blog.csdn.net/a512337862/article/details/89915641

前言

太长时间没有写博客了,感觉自己整个人都快荒废了,先把之前写的工具类拿过来凑个数。FileUtil 主要用于文件相关的工具类,主要是文件/文件夹的相关操作,具体的可参考代码注释。

代码

/**
 * Author : BlackHao
 * Time : 2018/4/9 10:10
 * Description : 文件工具类
 */
public class FileUtil {

    /**
     * 获取缓存文件
     *
     * @param context  上下文对象
     * @param fileName 文件名
     * @return 文件路径
     */
    public static File getTempFile(Context context, String fileName) {
        File file = null;
        try {
            String[] fix = fileName.split("\\.");
            String preFix = fix[0];
            String sufFix = null;
            if (fix.length > 1) {
                sufFix = "." + fix[1];
            }
            String path = context.getCacheDir().getAbsolutePath() + File.separator + "temp";
            //判断文件夹是否存在,不存在直接创建
            File folder = new File(path);
            if (!folder.exists()) {
                if (!folder.mkdirs()) {
                    //创建失败
                    LogHelper.getInstance().e("create folder " + path + " fail");
                    return null;
                }
            }
            file = File.createTempFile(preFix, sufFix, folder);
            //程序结束自动删除文件(这里好像并没有什么效果,所以需要手动去调用delTempFileBeforeTime)
            file.deleteOnExit();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }

    /**
     * 删除临时文件夹下,指定时间以前的所有临时文件
     *
     * @param context 上下文对象
     * @param msec    指定时间(毫秒)
     */
    public void delTempFileBeforeTime(Context context, long msec) {
        String path = context.getCacheDir().getAbsolutePath() + File.separator + "temp";
        delFileBeforeTime(path, msec);
    }

    /**
     * 删除文件夹下指定时间以前的所有文件
     *
     * @param folderPath 文件夹路径
     * @param msec       指定时间(毫秒),传 <=0 表示删除所有的文件
     */
    public static void delFileBeforeTime(String folderPath, long msec) {
        File folder = new File(folderPath);
        if (folder.exists() && folder.isDirectory()) {
            File[] files = folder.listFiles();
            if (files != null && files.length > 0) {
                for (File file : files) {
                    if (file.isFile() && (msec <= 0 || file.lastModified() < msec)) {
                        file.delete();
//                        LogHelper.getInstance().e("delete file :" + file.getAbsolutePath());
                    } else if (file.isDirectory()) {
                        delFileBeforeTime(file.getAbsolutePath(), msec);
                        //这里如果文件夹已经为空,直接删除文件夹
                        File[] folderFiles = file.listFiles();
                        if (folderFiles == null || folderFiles.length == 0) {
                            file.delete();
//                            LogHelper.getInstance().e("delete folder :" + file.getAbsolutePath());
                        }
                    }
                }
            }
        }
    }

    /**
     * 检测文件是否存在
     *
     * @param path 文件夹路径
     */
    public static boolean checkFileExists(String path) {
        File file = new File(path);
        //判断文件夹是否存在
        return file.exists();
    }

    /**
     * 拷贝文件到指定文件夹
     *
     * @param fromFilePath 文件的绝对路径
     * @param toFolder     目标文件夹
     */
    public static boolean copyFile(String fromFilePath, String toFolder) {
        boolean result = false;
        File from = new File(fromFilePath);
        File to = new File(toFolder);
        if (from.exists() && to.exists() && to.isDirectory()) {
            File dst = new File(toFolder + File.separator + from.getName());
            if (!dst.exists()) {
                try {
                    dst.createNewFile();
                    FileInputStream fis = new FileInputStream(from);
                    FileOutputStream fos = new FileOutputStream(dst);
                    byte[] data = new byte[10 * 1024];
                    int len;
                    while ((len = fis.read(data)) > 0) {
                        fos.write(data, 0, len);
                        fos.flush();
                    }
                    fos.close();
                    fis.close();
                    result = true;
                } catch (IOException e) {
                    LogHelper.getInstance().e("copyFile: " + e.toString());
                    result = false;
                }
            }
        } else {
            result = false;
        }
        return result;
    }

    /**
     * 拷贝整个文件夹内容到另一个文件夹(只拷贝文件夹内的所有文件)
     *
     * @param oldPath String 原文件路径
     * @param newPath String 复制后路径
     */
    public static void copyFolder(String oldPath, String newPath) {
        try {
            (new File(newPath)).mkdirs(); //如果文件夹不存在 则建立新文件夹
            File a = new File(oldPath);
            String[] file = a.list();
            File temp;
            for (String aFile : file) {
                if (oldPath.endsWith(File.separator)) {
                    temp = new File(oldPath + aFile);
                } else {
                    temp = new File(oldPath + File.separator + aFile);
                }

                if (temp.isFile()) {
                    //如果是文件,直接拷贝
                    copyFile(temp.getAbsolutePath(), newPath);
                } else if (temp.isDirectory()) {
                    //如果是子文件夹
                    copyFolder(oldPath + "/" + aFile, newPath + "/" + aFile);
                }
            }
        } catch (Exception e) {
            LogHelper.getInstance().e(e.toString());
            e.printStackTrace();
        }
    }

    /**
     * 删除单个文件
     **/
    public static boolean delSingleFile(String path) {
        File file = new File(path);
        return file.exists() && file.isFile() && file.delete();
    }

    /**
     * 修改文件/文件夹名
     *
     * @param path    文件路径
     * @param newName 文件新的名称
     */
    public static boolean modifyFileName(String path, String newName) {
        File file = new File(path);
        if (file.exists()) {
            String newPath = file.getParentFile().getAbsolutePath() + File.separator + newName;
            return file.renameTo(new File(newPath));
        }
        return false;
    }

    /**
     * 删除文件夹及其目录下所有文件
     *
     * @param folderPath 文件夹路径
     */
    public static void delFolder(String folderPath) {
        try {
            delFileBeforeTime(folderPath, 0); //删除完里面所有内容
            File myFilePath = new File(folderPath);
            myFilePath.delete(); //删除空文件夹
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 将URI转成绝对路径
     *
     * @param context 上下文对象
     * @param uri     URI
     * @return 绝对路径
     */
    public static String convertUriToPath(Context context, Uri uri) {
        if (null == uri) return null;
        String scheme = uri.getScheme();
        String data = null;
        if (scheme == null) {
            data = uri.getPath();
        } else if (ContentResolver.SCHEME_FILE.equals(scheme)) {
            data = uri.getPath();
        } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
            Cursor cursor = context.getContentResolver().query(uri, new String[]{MediaStore.Images.ImageColumns.DATA},
                    null, null, null);
            if (null != cursor) {
                if (cursor.moveToFirst()) {
                    int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
                    if (index > -1) {
                        data = cursor.getString(index);
                    }
                }
                cursor.close();
            }
        }
        return data;
    }

    /**
     * 是否是文本文件
     *
     * @param s 文件名
     */
    public static boolean isTextFile(String s) {
        s = s.toLowerCase();      //转成小写的
        return s.endsWith(".txt");
    }

    /**
     * 判断是否是图片文件
     *
     * @return fileName 文件名(文件路径)
     */
    public static boolean isImageFile(String fileName) {
        fileName = fileName.toLowerCase();      //转成小写的
        return fileName.endsWith(".jpg") || fileName.endsWith(".jpeg")
                || fileName.endsWith(".png");
    }

    /**
     * 判断是否是 Office 文件
     *
     * @return fileName 文件名(文件路径)
     */
    public static boolean isOfficeFile(String fileName) {
        fileName = fileName.toLowerCase();      //转成小写的
        return fileName.endsWith(".doc") || fileName.endsWith(".ppt") || fileName.endsWith(".xls")
                || fileName.endsWith(".docx") || fileName.endsWith(".pptx") || fileName.endsWith(".xlsx");
    }

    /**
     * 判断是否是视频文件
     *
     * @return fileName 文件名(文件路径)
     */
    public static boolean isVideoFile(String fileName) {
        fileName = fileName.toLowerCase();      //转成小写的
        return fileName.endsWith(".mp4") || fileName.endsWith(".flv");
    }

    /**
     * 获取指定文件夹的文件列表
     *
     * @param path 文件夹列表
     */
    public static List getFolderFile(String path) {
        List list = new ArrayList<>();
        File file = new File(path);
        if (!file.exists()) {
            //不存在则创建文件夹
            file.mkdirs();
        }
        if (file.isDirectory()) {
            File[] fileList = file.listFiles();
            if (fileList != null && fileList.length > 0) {
                Collections.addAll(list, fileList);
            }
        }
        return list;
    }

    /**
     * 获取 sdcard 可用空间的大小
     *
     * @return 可用空间
     */
    public static long getUseableSize() {
        File path = Environment.getExternalStorageDirectory();
        StatFs sf = new StatFs(path.getPath());
        long blockSize;
        long freeBlocks;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {
            blockSize = sf.getBlockSizeLong();
            freeBlocks = sf.getAvailableBlocksLong();
            // return freeBlocks * blockSize; //单位Byte
            // return (freeBlocks * blockSize)/1024; //单位KB
            return (freeBlocks * blockSize) / 1024 / 1024; // 单位MB
        } else {
            return -1;
        }

    }

}

结语

  • 源码以及测试demo下载地址:https://github.com/LuoChen-Hao/BlackHaoUtil
  • 有任何问题请留言。

你可能感兴趣的:(android,工具类)