Android 使用与其他平台上基于磁盘的文件系统类似的文件系统。

本文讲述如何使用 Android 文件系统通过 File API 读取和写入文件。

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

本文展示如何在您的应用中执行基本的文件相关任务。

假定您熟悉 Linux 文件系统的基础知识和 java.io 中的标准文件输入/输出 API。

选择内部或外部存储

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

内部存储:

它始终可用。 只有您的应用可以访问此处保存的文件。 当用户卸载您的应用时,系统会从内部存储中移除您的应用的所有文件。 当您希望确保用户或其他应用均无法访问您的文件时,内部存储是最佳选择。

外部存储:

它并非始终可用,因为用户可采用 USB 存储设备的形式装载外部存储,并在某些情况下会从设备中将其移除。 它是全局可读的,因此此处保存的文件可能不受您控制地被读取。 当用户卸载您的应用时,只有在您通过 getExternalFilesDir() 将您的应用的文件保存在目录中时,系统才会从此处移除您的应用的文件。 对于无需访问限制以及您希望与其他应用共享或允许用户使用计算机访问的文件,外部存储是最佳位置。

注:

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

提示:

尽管应用默认安装在内部存储中,但您可在您的清单文件中指定 android:installLocation 属性,这样您的应用便可安装在在外部存储中。当 APK 非常大且它们的外部存储空间大于内部存储时,用户更青睐这个选择。 如需了解详细信息,请参阅应用安装位置。

获取外部存储的权限

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

注意:

目前,所有应用都可以读取外部存储,而无需特别的权限。 但这在将来版本中会进行更改。如果您的应用需要读取外部存储(但不向其写入信息),那么您将需要声明 READ_EXTERNAL_STORAGE 权限。要确保您的应用继续正常工作,您应在更改生效前声明此权限。

将文件保存在内部存储中

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

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

要在这些目录之一中新建文件

1.您可以使用 File() 构造函数,传递指定您的内部存储目录的上述方法之一所提供的 File。例如:

File file = new File(context.getFilesDir(), filename); 2.或者,您可以调用 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();}

3.或者,如果您需要缓存某些文件,您应改用 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()。

无论您对于共享的文件使用 {@linkandroid.os.Environment#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 系统会删除以下各项:

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

android读写删file,Android文件(File)操作相关推荐

  1. android读写缓存文件路径,Android app-cache-Path的 缓存图片、缓存文件的路径包名路径 和外路径比较...

    代码对应的路径: //判断手机是否挂在sd卡 String externalStorageState= Environment.getExternalStorageState(); File down ...

  2. android读写access数据库,Android中利用远程Microsoft Access数据库应用程序

    我写一个Android应用程序,它接受一个字符串,通过条码阅读器读取,然后当一个特定的按钮按下时,它会认为字符串发送到数据库将他们的价值设定为"库存"或"缺货" ...

  3. android 读写project.properties,Android project.properties与default.properties

    default.properties和android库不见了报错 有时在使用不同版本eclipse开发时,比如我这里在android4.0的环境中导入了我之前在2.0的android工程后,再返回来使 ...

  4. Python 读写txt和excel文件及操作数据库

    前言 我们经常会遇到我们对数据库中数据进行拉取并处理脚本,我们如果要操作线上数据库.用java操作就过于麻烦,这个时候我们更方便的方法是直接通过一个python脚本去读取数据库,并进行处理数据.那么我 ...

  5. android sd卡列目录文件_Android正确获取SD卡目录及使用SD卡目录

    此文乃是转载,原文在这里链接 SD卡作为手机的扩展存储设备,在手机中充当硬盘角色,可以让我们手机存放更多的数据以及多媒体等大体积文件.因此查看SD卡的内存就跟我们查看硬盘的剩余空间一样,是我们经常操作 ...

  6. android java file 清理垃圾获取文件大小 删除文件等操作

    这么久没有写博客了,今天给大家分享一些多file文件的操作.一般可以用到清理垃圾获取文件大小 删除文件等操作,可以直接用于工具类里面,直接做操作便可以 public final class FileU ...

  7. android 获取文件夹的字节数,android java file 清理垃圾获取文件大小 删除文件等操作...

    这么久没有写博客了,今天给大家分享一些多file文件的操作.一般可以用到清理垃圾获取文件大小 删除文件等操作,可以直接用于工具类里面,直接做操作便可以 public final class FileU ...

  8. Android SD卡简单的文件读写操作

    最近有这样的需求,把每次统计到的数据,以txt形式保存到手机SD卡或是手机内存中,遇到一些问题,记录下来. 首先如果要在程序中使用sdcard进行存储,我们必须要在AndroidManifset.xm ...

  9. android 读写文件 简书,Android 中的文件操作

    Android 文件操作 概述 Android 中的文件操作主要涉及到两个部分,一个是内部存储的读写,一个是外部存储的读写两者的主要区别如下表: 内部存储 外部存储 始终可用 它并非始终可用,因为用户 ...

最新文章

  1. ping ip 端口_学生会私房菜【20200305期】——Ping命令及其常用参数详解
  2. 【SpringCloud】Zuul-实例
  3. 报错笔记:cannot convert parameter 1 from 'char [1024]' to 'unsigned char *'
  4. SpringBoot日记——ElasticSearch全文检索
  5. Qt中的QSpinBox
  6. mybatisplus 一次性执行多条SQL语句插入(Mysql篇)
  7. Linux 实操———CentOS 6 安装配置 Tomcat
  8. mac cad石材填充图案_CAD怎么填充颜色?
  9. 例子---随机数/不重复的随机数
  10. 使用工具包自动生成向EBS系统注册表和字段的代码
  11. Nopcommerce主要用到的技术及特点
  12. virtualmin修改php.ini,virtualmin安装和配置使用
  13. 2017 年“认证杯”数学中国数学建模网络挑战赛 比赛心得
  14. java方法重载的好处_Java方法重载浅谈
  15. vue等单页面应用及其优缺点
  16. windows下载安装ElasticSearch
  17. div+css画六边形
  18. 洞悉旅居新市场,木莲庄酒店集团开拓酒店多元新玩法
  19. Python-量化投资(一)
  20. Google Earth Engine(GEE)——Python干旱严重程度案例分析

热门文章

  1. (dfs/dp)P2327 [SCOI2005]扫雷
  2. python爬虫实战,爬虫之路,永无止境
  3. Android P版本应用兼容性适配技术指导
  4. JavaScript 行间事件、提取行间事件
  5. 固态硬盘的S.M.A.R.T详解
  6. 恋与实习生服务器维护,恋与制作人设计实习生事件选什么好?恋与制作人设计实习生事件选择推荐...
  7. 微信与支付宝钱包的竞争分析
  8. springboot RabbitMQ整合出现Reply received after timeout 异常
  9. codeforces1000a csdn-博客
  10. codeforces 1000A,T-sthirt