关于Android中几个常用文件路径的介绍

Android 使用与其他平台上基于磁盘的文件系统类似的文件系统。 本课程讲述如何使用 Android 文件系统通过 File API 读取和写入文件。

File 对象适合按照从开始到结束的顺序不跳过地读取或写入大量数据。 例如,它适合于图片文件或通过网络交换的任何内容。

本课程展示如何在您的应用中执行基本的文件相关任务。本课程假定您熟悉 Linux 文件系统的基础知识和 java.io 中的标准文件输入/输出 API。

选择内部或外部存储

所有 Android 设备都有两个文件存储区域:“内部”和“外部”存储。这些名称在 Android 早期产生,当时大多数设备都提供内置的非易失性内存(内部存储),以及移动存储介质,比如微型 SD 卡(外部存储)。一些设备将永久性存储空间划分为“内部”和“外部”分区,即便没有移动存储介质,也始终有两个存储空间,并且无论外部存储设备是否可移动,API 的行为均一致。以下列表汇总了关于各个存储空间的实际信息。

内部存储:

它始终可用。
只有您的应用可以访问此处保存的文件。
当用户卸载您的应用时,系统会从内部存储中移除您的应用的所有文件。

当您希望确保用户或其他应用均无法访问您的文件时,内部存储是最佳选择。

外部存储:

它并非始终可用,因为用户可采用 USB 存储设备的形式装载外部存储,并在某些情况下会从设备中将其移除。
它是全局可读的,因此此处保存的文件可能不受您控制地被读取。
当用户卸载您的应用时,只有在您通过 getExternalFilesDir() 将您的应用的文件保存在目录中时,系统才会从此处移除您的应用的文件。

对于无需访问限制以及您希望与其他应用共享或允许用户使用计算机访问的文件,外部存储是最佳位置。

注:在 Android N 之前,内部文件可以通过放宽文件系统权限让其他应用访问。而如今不再是这种情况。如果您希望让其他应用访问私有文件的内容,则您的应用可使用 FileProvider。 请参阅共享文件。

提示:尽管应用默认安装在内部存储中,但您可在您的清单文件中指定 android:installLocation 属性,这样您的应用便可安装在在外部存储中。当 APK 非常大且它们的外部存储空间大于内部存储时,用户更青睐这个选择。

获取外部存储的权限

要向外部存储写入信息,您必须在您的清单文件中请求 WRITE_EXTERNAL_STORAGE 权限。

将文件保存在内部存储中

在内部存储中保存文件时,您可以通过调用以下两种方法之一获取作为 File 的相应目录:

getFilesDir()
返回表示您的应用的内部目录的 File 。
getCacheDir()
返回表示您的应用临时缓存文件的内部目录的 File。 务必删除所有不再需要的文件并对在指定时间您使用的内存量实现合理大小限制,比如,1MB。 如果在系统即将耗尽存储,它会在不进行警告的情况下删除您的缓存文件。

要在这些目录之一中新建文件,您可以使用 File() 构造函数,传递指定您的内部存储目录的上述方法之一所提供的 File。例如:

File file = new File(context.getFilesDir(), filename);

或者,您可以调用 openFileOutput() 获取写入到内部目录中的文件的 FileOutputStream。例如,下面显示如何向文件写入一些文本:

String filename = "myfile";
String string = "Hello world!";
FileOutputStream outputStream;try {outputStream = openFileOutput(filename, Context.MODE_PRIVATE);outputStream.write(string.getBytes());outputStream.close();
} catch (Exception e) {e.printStackTrace();
}

或者,如果您需要缓存某些文件,您应改用 createTempFile()。例如,以下方法从 URL 提取文件名并正在您的应用的内部缓存目录中以该名称创建文件:

public File getTempFile(Context context, String url) {File file;try {String fileName = Uri.parse(url).getLastPathSegment();file = File.createTempFile(fileName, null, context.getCacheDir());} catch (IOException e) {// Error while creating file}return file;
}

注:您的应用的内部存储设备目录由您的应用在 Android 文件系统特定位置中的软件包名称指定。从技术上讲,如果您将文件模式设置为可读,那么,另一应用也可以读取您的内部文件。 但是,此应用也需要知道您的应用的软件包名称和文件名。 其他应用无法浏览您的内部目录并且没有读写权限,除非您明确将文件设置为可读或可写。 只要您为内部存储上的文件使用 MODE_PRIVATE,其他应用便从不会访问它们。

将文件保存在外部存储中

由于外部存储可能不可用—比如,当用户已将存储装载到电脑或已移除提供外部存储的 SD 卡时—因此,在访问它之前,您应始终确认其容量。 您可以通过调用 getExternalStorageState() 查询外部存储状态。 如果返回的状态为 MEDIA_MOUNTED,那么您可以对您的文件进行读写。 例如,以下方法对于确定存储可用性非常有用:

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {String state = Environment.getExternalStorageState();if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;}
    return false;
}/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {String state = Environment.getExternalStorageState();if (Environment.MEDIA_MOUNTED.equals(state) ||Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        return true;}
    return false;
}

尽管外部存储可被用户和其他应用进行修改,但您可在此处保存两类文件:

公共文件
应供其他应用和用户自由使用的文件。 当用户卸载您的应用时,用户应仍可以使用这些文件。

例如,您的应用拍摄的照片或其他已下载的文件。

私有文件
属于您的应用且在用户卸载您的应用时应予删除的文件。 尽管这些文件在技术上可被用户和其他应用访问(因为它们存储在外部存储中), 但它们实际上不向您的应用之外的用户提供任何输出值。 当用户卸载您的应用时,系统会删除应用外部私有目录中的所有文件。

例如,您的应用下载的其他资源或临时介质文件。

如果您要将公共文件保存在外部存储设备上,请使用 getExternalStoragePublicDirectory() 方法获取表示外部存储设备上相应目录的 File。 该方法使用指定您想要保存以便它们可以与其他公共文件在逻辑上组织在一起的文件类型的参数,比如 DIRECTORY_MUSIC 或 DIRECTORY_PICTURES。例如:

public File getAlbumStorageDir(String albumName) {// Get the directory for the user's public pictures directory.File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), albumName);if (!file.mkdirs()) {Log.e(LOG_TAG, "Directory not created");}return file;
}

如果您要保存您的应用专用文件,您可以通过调用 getExternalFilesDir() 并向其传递指示您想要的目录类型的名称,从而获取相应的目录。通过这种方法创建的各个目录将添加至封装您的应用的所有外部存储文件的父目录,当用户卸载您的应用时,系统会删除这些文件。

例如,您可以使用以下方法来创建个人相册的目录:

public File getAlbumStorageDir(Context context, String albumName) {// Get the directory for the app's private pictures directory.File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), albumName);if (!file.mkdirs()) {Log.e(LOG_TAG, "Directory not created");}return file;
}

如果没有适合您文件的预定义子目录名称,您可以改为调用 getExternalFilesDir() 并传递 null。这将返回外部存储上您的应用的专用目录的根目录。

切记,getExternalFilesDir() 在用户卸载您的应用时删除的目录内创建目录。如果您正保存的文件应在用户卸载您的应用后仍然可用—比如,当您的应用是照相机并且用户要保留照片时—您应改用 getExternalStoragePublicDirectory()。

无论您对于共享的文件使用 getExternalStoragePublicDirectory() 还是对您的应用专用文件使用 getExternalFilesDir(),您使用诸如 DIRECTORY_PICTURES 的 API 常数提供的目录名称非常重要。这些目录名称可确保系统正确处理文件。 例如,保存在 DIRECTORY_RINGTONES 中的文件由系统媒体扫描程序归类为铃声,而不是音乐。

查询可用空间

如果您事先知道您将保存的数据量,您可以查出是否有足够的可用空间,而无需调用 getFreeSpace() 或 getTotalSpace() 引起 IOException。这些方法分别提供目前的可用空间和存储卷中的总空间。 此信息也可用来避免填充存储卷以致超出特定阈值。

但是,系统并不保证您可以写入与 getFreeSpace() 指示的一样多的字节。如果返回的数字比您要保存的数据大小大出几 MB,或如果文件系统所占空间不到 90%,则可安全继续操作。否则,您可能不应写入存储。

注:保存您的文件之前,您无需检查可用空间量。 您可以尝试立刻写入文件,然后在 IOException 出现时将其捕获。 如果您不知道所需的确切空间量,您可能需要这样做。 例如,如果在保存文件之前通过将 PNG 图像转换成 JPEG 更改了文件的编码,您事先将不知道文件的大小。

删除文件

您应始终删除不再需要的文件。删除文件最直接的方法是让打开的文件参考自行调用 delete()。

myFile.delete();

如果文件保存在内部存储中,您还可以请求 Context 通过调用 deleteFile() 来定位和删除文件:

myContext.deleteFile(fileName);

注:当用户卸载您的应用时,Android 系统会删除以下各项:

  1. 您保存在内部存储中的所有文件
  2. 您使用 getExternalFilesDir() 保存在外部存储中的所有文件。

但是,您应手动删除使用 getCacheDir() 定期创建的所有缓存文件并且定期删除不再需要的其他文件。

常见的获取文件路径方法,对应的绝对路径

getCacheDir().getAbsolutePath():

/data/data/packagename/cache

getFilesDir().getAbsolutePath():

/data/data/packagename/files

以上为内存存储路径,以下为外部存储路径

getExternalCacheDir().getAbsolutePath():
可以作为外部缓存的路径,卸载app时,会自动删除文件

/storage/emulated/0/Android/data/packagename/cache

Environment.getExternalStorageDirectory().getAbsolutePath():

/storage/emulated/0

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath()):

/storage/emulated/0/DCIM

getExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsolutePath:

/storage/emulated/0/Android/data/packagename/files/Pictures

Android 关于文件存储路径的总结相关推荐

  1. android studio文件存储路径,配置Android Studio的缓存文件路径(释放你的C盘)

    Android Studio默认安装完后会在C:\Users\YourName.xxx 缓存一些数据,有限的C盘很容易爆增. 如果你的C盘也像我这样捉襟见肘,或者你是处女座的,那么请看完本文,结果会让 ...

  2. Android获取文件夹路径

    Android获取文件夹路径 应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的. 大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中. ...

  3. android存储视频文件夹在哪,Android 中 视频存储路径的一个方案

    版权声明:本文为博主原创文章,未经博主允许不得转载. 在进行视频的下载时,我们经常会面临存储路径的选择,选择一个好的存储路径能对Android系统中的内存起到优化的作用.主流app下载路径分析和常见的 ...

  4. android 获取默认存储路径,Android获取外置SD卡存储路径的方法

    在开发应用的过程中,经常会遇到需要获取设备存储路径的问题.而从网上看到的很多方法获取到的都是内置存储位置,并非外置SD卡路径,因此我推荐使用反射的机制来获取外置存储的路径. 通常,使用Environm ...

  5. android 数据文件存储,实例详解Android文件存储数据方式

    总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.下面通过本文给大家介绍android文件存储数据方式. 1.文件存储数据使用了java中的io操作来进行文件的保存和读取,只不 ...

  6. android uid文件存储目录,Android系统文件目录结构

    忍不住整理了一份自己喜欢的阅读风格 层次分明的Android文件目录,清晰的结构帮你更好的理解Android系统 有补充欢迎评论 |-3rdmodemnvm |-3rdmodemnvmbkp |-ac ...

  7. Android本地文件存储,机身和外置sd卡

    在安卓的开发中,有时候要用到大文件的存储,这个时候就不能存储在应用内部(data/data),只能借助外部存储.而外部存储又分为手机机身的存储空间(一级sd卡)和外置sd卡存储空间(二级sd卡). 1 ...

  8. Eclipse查找文件存储路径

    1.打开Eclipse,去找导航栏 2.点击file 3.点击properties 4.即可看到存储路径 5.可以点击存储路径找到该文件在电脑的储存位置 从此上传作业,找不到文件位置不再是烦恼.

  9. android 文件存储位置,安卓各文件存储路径汇总(Android file path)

    写下来,省得以后不记得到处翻: Environment.getDataDirectory() = /data Environment.getDownloadCacheDirectory() = /ca ...

最新文章

  1. 我是如何组织“算法刻意练习活动”的?
  2. tftp环境搭建笔记
  3. C++中四种类型转换方式
  4. android 开发文档模板
  5. mysql win10 优化设置_windows10如何优化?系统优化设置方法
  6. 序列化:protobuf原理
  7. 杨强教授团队权威专著《联邦学习》问世,展现数据孤岛和数据保护难题破解之法
  8. 终端SSH工具SecureCRT 9.2.0 for Mac
  9. caffe 训练solver配置
  10. ESP8266(2)
  11. 项目: 生命游戏(C语言)
  12. 996工作制,还要抽时间提升自己吗?
  13. 如何注册Google Voice账号(电话号码)
  14. 手把手Django入门 初步实现管理职位后台
  15. ArcGIS10.2 安装教程
  16. 将Firefox浏览器的Google工具栏拖动到浏览器底部
  17. JavaScript怎么获取当前时间的年月日?
  18. 3个python库的图像增强
  19. 【图像处理】获取图片像素点
  20. 手机端如何阻止苹果浏览器输入框默认放大事件

热门文章

  1. Pytorch 扩展单张图片维度
  2. 运算放大器积分电路原理
  3. 【数据结构(C++)】用链队列计算杨辉三角
  4. 写出求一元二次方程根的流程图
  5. android锁屏代码分析,Android 监听锁屏、解锁、开屏 功能代码
  6. ThreadLocal中的WeakReference
  7. linux系统中的进程调度采用( ),Linux系统中的进程调度.ppt
  8. CDA_Level1_思维导图
  9. Django时区是否开启,开启后注意事项
  10. Salesforce中jquery ui中的autoComplete实现自动联想