Android文件存储小结

文件目录分类

属于应用的文件夹:

Context.getFilesDir(): /data/user/0/com.njfae.filesavedemo/files
Context.cacheDir(): /data/user/0/com.njfae.filesavedemo/cache
Context.externalCacheDir(): /storage/emulated/0/Android/data/com.njfae.filesavedemo/cache
Context.getExternalFilesDir(type): /storage/emulated/0/Android/data/com.njfae.filesavedemo/files/type

不属于应用的文件夹:

Environment.getExternalStorageDirectory(): /storage/emulated/0
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM): /storage/emulated/0/DCIM

注意:

  1. 带有 cache 的表示缓存文件
  2. 属于应用的文件夹里面的文件容易被一些第三方文件清理软件清理
  3. 系统设置中点击 清理缓存 会清理所有缓存文件中的文件,清理数据 会清理所有属于应用的文件
  4. external 相关的目录不一定有,在手机和电脑做文件交互的时候会被移除。

权限问题

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

属于应用的文件夹的操作不需要权限, 不属于应用的文件夹需要权限

SDCard 不存在问题

在获取应用目录的时候加一个判断。

public File getDiskCacheDir(Context context, String uniqueName) {  
    String cachePath;  
    if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())  
            || !Environment.isExternalStorageRemovable()) {  
        cachePath = context.getExternalCacheDir().getPath();  
    } else {  
        cachePath = context.getCacheDir().getPath();  
    }  
    return new File(cachePath + File.separator + uniqueName);  
}

使用 DiskLruCache 实现缓存文件夹最大内存的限制

DiskLruCache

FileProvider

作用:Android 7.0 之后和其他应用做文件交互的时候使用。

用于生成 Uri。

public static String getFilePathFromURI(Context context, Uri contentUri) {
    //copy file and send new file path 
    String fileName = getFileName(contentUri);
    if (!TextUtils.isEmpty(fileName)) {
        File copyFile = new File(TEMP_DIR_PATH + File.separator + fileName);
        copy(context, contentUri, copyFile);
        return copyFile.getAbsolutePath();
    }
    return null;
}

public static String getFileName(Uri uri) {
    if (uri == null) return null;
    String fileName = null;
    String path = uri.getPath();
    int cut = path.lastIndexOf('/');
    if (cut != -1) {
        fileName = path.substring(cut + 1);
    }
    return fileName;
}

public static void copy(Context context, Uri srcUri, File dstFile) {
    try {
        InputStream inputStream = context.getContentResolver().openInputStream(srcUri);
        if (inputStream == null) return;
        OutputStream outputStream = new FileOutputStream(dstFile);
        IOUtils.copy(inputStream, outputStream);
        inputStream.close();
        outputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,842评论 25 709
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,653评论 9 468
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,243评论 2 33
  • “如果说,缘份就在那年那时的沉默中埋下了种子,你愿意相信吗?”毕业后,暂闲赋在家的朵朵独自爬格子时脑海里闪过这...
    纳兰紫潇阅读 594评论 2 2
  • 只要我们活着,我们总是在做一些事情:工作、学习、玩、吃东西、睡觉、呼吸…..人生永恒的问题不是我们将要做什么,而是...
    快乐的老露阅读 1,167评论 0 2