android 保存文件的各种目录列表

一般的,我们可以通过context和Environment来获取要保存文件的目录

($rootDir)
+- /data                -> Environment.getDataDirectory()
|   |
|   |   ($appDataDir)
|   +- data/com.srain.cube.sample
|       |
|       |   ($filesDir)
|       +- files            -> Context.getFilesDir() / Context.getFileStreamPath("")
|       |       |
|       |       +- file1    -> Context.getFileStreamPath("file1")
|       |   ($cacheDir)
|       +- cache            -> Context.getCacheDir()
|       |
|       +- app_$name        ->(Context.getDir(String name, int mode)
|
($rootDir)
+- /storage/sdcard0     -> Environment.getExternalStorageDirectory()
    |                       / Environment.getExternalStoragePublicDirectory("")
    |
    +- dir1             -> Environment.getExternalStoragePublicDirectory("dir1")
    |
    |   ($appDataDir)
    +- Andorid/data/com.srain.cube.sample
        |
        |   ($filesDir)
        +- files        -> Context.getExternalFilesDir("")
        |   |
        |   +- file1    -> Context.getExternalFilesDir("file1")
        |   +- Music    -> Context.getExternalFilesDir(Environment.Music);
        |   +- Picture  -> ... Environment.Picture
        |   +- ...
        |
        |   ($cacheDir)
        +- cache        -> Context.getExternalCacheDir()
        |
        +- ???

各个路径的特性

下面介绍这些路径的特性以及使用中需要注意的细节:

1.根目录($rootDir):

  • 内部存储路径: /data, 通过Environment.getDataDirectory() 获取
  • 外部存储路径: /storage/sdcard0 (也有类似 /mnt/ 这样的),通过Environment.getExternalStorageDirectory()获取

  示例

   

Environment.getDataDirectory():
        /data

Environment.getExternalStorageDirectory():
        /storage/sdcard0

2.应用数据目录($appDataDir)

  • 内部储存: $appDataDir = $rootDir/data/$packageName,
  • 外部存储: $appDataDir = $rootDir/Andorid/data/$packageName

  在这些目录下的数据,在app卸载之后,会被系统删除,我们应将应用的数据放于这两个目录中。

3.外部存储中,公开的数据目录。 这些目录将不会随着应用的删除而被系统删除,请斟酌使用:

    

Environment.getExternalStorageDirectory():
    /storage/sdcard0

// 同 $rootDir
Environment.getExternalStoragePublicDirectory(""):
    /storage/sdcard0

Environment.getExternalStoragePublicDirectory("folder1"):
    /storage/sdcard0/folder1

4.应用数据目录下的目录

  一般的在$appDataDir下,会有两个目录:

  1. 数据缓存:$cacheDir = $appDataDir/cache:

    •   内部存储:Context.getCacheDir(), 机身内存不足时,文件会被删除
    • 外部存储:Context.getExternalCacheDir()

      外部存储没有实时监控,当空间不足时,文件不会实时被删除,可能返回空对象

      示例

    Context.getCacheDir():
        /data/data/com.srain.cube.sample/cache

    Context.getExternalCacheDir():
        /storage/sdcard0/Android/data/com.srain.cube.sample/cache        

  2.文件目录 $filesDir = $appDataDir/files:

    内部存储:通过Context.getFilesDir() 获取

    Context.getFileStreamPath(String name)返回以name为文件名的文件对象,name为空,则返回 $filesDir 本身

    示例:

    

Context.getFilesDir():
        /data/data/com.srain.cube.sample/files

Context.getFileStreamPath(""):
        /data/data/com.srain.cube.sample/files

Context.getFileStreamPath("file1"):
        /data/data/com.srain.cube.sample/files/file1

    外部存储:通过Context.getExternalFilesDir(String type)type为空字符串时获取.

    type系统指定了几种类型:

    Environment.DIRECTORY_MUSIC

    Environment.DIRECTORY_PICTURES ...

   示例

  

    Context.getExternalFilesDir(""):
        /storage/sdcard0/Android/data/com.srain.cube.sample/files

    Context.getExternalFilesDir(Environment.DIRECTORY_MUSIC)
        /storage/sdcard0/Android/data/com.srain.cube.sample/files/Music

  3.$cacheDir / $filesDir 安全性

  在内部存储中,$cacheDir$filesDir是app安全的,其他应用无法读取本应用的数据,而外部存储则不是。

  在外部存储中,这两个文件夹其他应用程序也可访问。

  在外部存储中,$filesDir中的媒体文件,不会被当做媒体扫描出来,加到媒体库中。

  4.$cacheDir / $filesDir 同级目录

  在内部存储中:通过 Context.getDir(String name, int mode)可获取和 $filesDir / $cacheDir 同级的目录

  目录的命名规则为 app_ + name, 通过mode可控制此目录为app私有还是其他app可读写。

  示例:

    Context.getDir("dir1", MODE_PRIVATE):
        Context.getDir: /data/data/com.srain.cube.sample/app_dir1

  5.特别注意, 对于外部存储,获取$cacheDir 或者 $filesDir及其下的路径

  在API level 8 以下,或者空间不足,相关的方法获路径为空时,需要自己构造。

@TargetApi(VERSION_CODES.FROYO)
public static File getExternalCacheDir(Context context) {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO)) {
        File path = context.getExternalCacheDir();

        // In some case, even the sd card is mounted,
        // getExternalCacheDir will return null
        // may be it is nearly full.
        if (path != null) {
            return path;
        }
    }

    // Before Froyo or the path is null,
    // we need to construct the external cache folder ourselves
    final String cacheDir = "/Android/data/" + context.getPackageName() + "/cache/";
    return new File(Environment.getExternalStorageDirectory().getPath() + cacheDir);
}

参考:http://liaohuqiu.net/cn/posts/storage-in-android/

时间: 2024-08-21 13:43:13

android 保存文件的各种目录列表的相关文章

[android] 保存文件到手机内存

1. 界面的准备工作,普通登录界面,采用线性布局和相对布局. <Checkbox/>有个属性 android:checked=”true”,默认选中状态,相对布局里面<Button/>位于右边android:layout_alignParentRight=”true”,位于父控件的右面.密码框星号显示android:inputType=”textPassword” 2. 遇到device not found等错误可以直接忽略掉,布局文件属性里面绑定点击方法,传入的参数View对象代

Android 保存文件

背景                                                                                             我们以常见的登录的时候有CheckBox来显示是否保存帐号密码的形式来生动的讲解这个故事. 最后是以txt文档保存,用到的是Java的IO操作. 这个只是粗略的,大家不喜勿喷. 保存文件                                                              

[android] 保存文件到SD卡

手机里面有两块空间,手机内部空间(/data/data/)和外部存储空间(/mnt/sdcard/ 或者直接/sdcard/) 与上面的代码基本一样,只是在new File(“/sdcard/文件名”),此时会报错,primission denied Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied) 在清单文件中添加权限 android.primission.WRITE_EXTERNAL_S

c# 下载并保存文件在程序目录

public void HttpDownloadFile(string url) { string strFileName = url.Substring(url.LastIndexOf("/")+1); // 设置参数 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; //发送请求并获取相应回应数据 HttpWebResponse response = request.GetResponse() as

Android保存的文件显示到文件管理的最近文件和下载列表中

发现Android开发每搞一个和系统扯上关系的功能都要磨死人,对新手真不友好.运气不好难以快速精准的找到有效的资料?? 这篇记录的是Android中如何把我们往存储中写入的文件,如何显示到文件管理的下载列表.最近文件列表中. 假设保存的文件为外部存储中的File file,也许是app私有目录中的(未测试).也许是外部存储根目录中download.pictures等目录中的(没发现问题). 测试支持Android 4.0 - 9.0. 第一步,暴力扔给媒体扫描,管你是不是图片 如果我们的文件是图

(九)android 中数据存储与访问——保存文件到手机内存

9.1手机的存储区域 手机的存储区域通常有两个地方:一:手机内部存储空间,理解成一块微硬盘/data/data/:二:外部存储空间SD卡 9.2方法捕获异常的原则 如果方法有返回值,则用try catch捕获,如果方法的返回值是Void类型,则使用throws抛出异常 9.3 上下文Context Context:是一个类,提供一些方便的api 可以得到应用程序的环境,例如:环境的包名,安装路径,资源路径,资产的路径 9.4 保存文件到手机内存——登陆界面例子程序 9.4.1 项目需求 用户登陆

无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.demo1" /> 上面targetPackage指定的包要和应用的package相同. (2)在清单文件中ap

Android学习笔记——保存文件(Saving Files)

Android设备有两种文件存储区域:   内部存储和外部存储 ("internal" and "external" storage). 这名字来自早期Android,那时大多数Android设备提供两种存储方式:内置的非易失的内存(内部存储)和可移动的存储例如micro SD卡(外部存储). 一些设备将永久内存分为内部和外部两部分,因此即使没有外部存储,依旧有两种存储空间.不管有没有外部存储,API的方法都是一样的.     内部存储: 始终都是可用的 保存的文件

获取data下目录文件和查看android数据库文件

首先要是在真机上查看android数据库文件必须要取得root权限,这里怎么获取就不在多说.可能是手机的原因,本人获取到的手机权限如下: 虽然data目录下的权限已经开放,可是data下的包权限却未获取到write权限,基于这种情况解决方法如下: 通过命令行获取到该包的权限,可以看到目前该包权限已经开放: 这样就可以读取到该包下的文件,类似的权限问题也可通过该方式解决.通过类似的方法获取到数据库文件然后通过DDMS中导出按钮导出数据库文件,并保存为sql格式,使用可视化工具SQLite Expo