将数据保存到Android应用程序中的文件

这是我系列中有关在Android应用程序中存储的第二篇文章。 其他帖子可以在这里找到:

http://www.javacodegeeks.com/2014/06/introduction-how-to-save-data-in-your-android-application.html

这篇文章是关于从Android应用程序保存到文件的,这是存储数据的最简单方法。 在许多情况下,您可能需要保存文件:您可能希望使用现有的文件格式来创建可由用户在另一个应用程序中打开的文件,或者数据足够简单,可以用文本文件表示或XML或YAML之类的格式。 对于复杂数据,数据库可能是一个更好的选择,因为访问和解析大文件可能很慢,并且除非您手动编写代码,否则不会进行完整性检查。 另一方面,与使用数据库中的数据进行调试相比,开销更小并且使用文件更容易进行处理。 根据用户将如何与文件交互(或不与文件交互),您需要首先确定要使用哪种存储。

内部存储器

每个应用程序都有其自己的专用内部存储器来保存文件。 如果用户不能从您的应用程序外部修改文件,并且其他应用程序不能访问这些文件,则使用这种存储方式。 由于内部存储器是您的应用程序专用的文件,因此,如果您卸载了应用程序,则文件将被删除。 内部存储器也是默认情况下安装应用程序的位置,因此您的文件将始终可用。 在某些较旧或更便宜的设备上,内部存储空间非常有限,因此,如果需要支持这些设备,则需要注意保存的数据大小。

绝对不要硬编码存储目录的路径,因为该目录可能会根据所使用的Android OS的版本而变化。 同样,Android 4.4引入了多用户的概念:在这种情况下,内部和外部存储取决于登录的用户,其他用户的文件将不可见。 以下是一些用于获取内部存储路径的方法:

  • android.content.Context.getFilesDir():从当前上下文返回一个java.io.File对象,该对象表示应用程序内部存储的根目录。
  • android.content.Context.getDir(String name,Context.MODE_PRIVATE) 返回一个java.io.File对象,该对象表示内部存储中的目录名称 ,如果目录不存在,则创建该目录。 第二个参数也可以用于将目录设置为MODE_WORLD_READABLE或MODE_WORLD_WRITABLE,因此它在所有其他应用程序中都可见,但这在安全性方面是有风险的,并且在API级别17(Android 4.2)中已弃用。
  • android.content.Context.getCacheDir():返回一个java.io.File对象,该对象表示应用程序的内部缓存目录。 这意味着小文件(文档建议总共不超过1MB)可以在系统需要更多存储空间时随时删除。 无法保证将清除缓存,因此,当不再需要这些文件时,还必须手动清除它们。

如您所见,文件由java.io namepace中的File对象表示:没有特定于Android SDK的文件对象,并且使用用于读取和写入文件的标准Java API。 此外,由于Android清单已经是应用程序专用的,因此在Android清单中没有设置特定的应用程序权限以使用内部存储。

外部存储

除了内部存储,在卸载应用程序时,所有应用程序都共享一个外部存储空间。 这是使用文件资源管理器应用程序以及将设备插入计算机时显示的存储。 它可能被实现为可移除的SD卡,或者被实现为设备中内置存储的分区,因此即使移除或更改了该卡,您的应用程序也应该能够工作。 要检查外部存储的当前状态,可以调用getExternalStorageState()方法。

在具有许多用户的设备(从Android 4.4开始)上,外部存储设备专用于当前用户,并且其他用户的文件无法访问。 此外,如果设备具有内置外部存储器(该内部存储器是内部存储器和SD卡上的分区),则可能会有多个外部存储器:在这种情况下,内置存储器是主要的外部存储器。 从外部存储读取文件需要READ_EXTERNAL_STORAGE权限,而写入或读取文件则需要WRITE_EXTERNAL_STORAGE权限。

这是您应该用来获取主要外部存储目录的方法:

  • android.os.Environment.getExternalStorageDirectory():返回一个java.io.File对象,该对象代表所有应用程序共享的设备的主要外部存储的根目录。
  • android.os.Environment.getExternalStoragePublicDirectory():返回一个java.io.File对象,该对象代表设备主要外部存储设备上特定类型文件的公共目录。 例如,您可以通过调用Environment.getExternalStoragePublicDirectory( 环境 .DIRECTORY_MUSIC)或公开的图片目录通过调用Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)获取路径对公众的音乐目录。
  • android.content.Context.getExternalFilesDir():返回一个java.io.File,它表示特定于您的应用程序的主外部存储的根目录,该目录位于getExternalStorageDirectory()返回的目录下。 与外部存储的其他目录不同,卸载应用程序时,存储在该文件夹中的文件将被删除。 因此,如果您需要存储应用程序只需要的文件,则应使用此文件夹。 此外,从Android 4.4开始,应用程序无需读取或写入其自身的外部存储就具有特定的权限,但是对于较旧的版本,您的应用程序需要READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE权限。
  • android.content.Context.getExternalFilesDirs():返回一个java.io.File数组,该数组表示应用程序可以使用的所有外部存储目录的根目录,主外部存储作为该数组的第一个目录。 所有这些目录的工作方式与getExternalFilesDir()方法返回的主存储相同。 如果设备具有内置存储设备作为主要外部存储设备,并且具有SD卡作为辅助外部存储设备,则这是通往SD卡的唯一途径。 此方法是在Android 4.4中引入的,在此之前无法获得通往二级存储的路径。
  • android.content.Context.getExternalCacheDir():返回一个java.io.File对象,该对象表示应用程序在主外部存储上的缓存。 该缓存对用户不可见,并且在卸载应用程序时将其删除。 Android SDK中没有机制可以删除缓存目录中的文件,因此您需要管理缓存以使其保持在合理的最大大小。 从Android 4.4开始,该应用程序不需要访问其自己的缓存的权限,但是对于旧版本,您的应用程序需要READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE权限。

保存到文件的示例代码

要保存文件,您需要获取要使用的存储的路径,无论使用哪种存储类型,都以相同的方式使用该路径,因为所有方法都返回一个代表要使用目录的java.io.File对象。 这是一个使用外部存储器从Activity中保存文本文件的示例:

try
   {
                            // Creates a trace file in the primary external storage space of the 
                            // current application.
                            // If the file does not exists, it is created.
   File traceFile = new File(((Context)this).getExternalFilesDir(null), "TraceFile.txt");
   if (!traceFile.exists())
      traceFile.createNewFile();
                            // Adds a line to the trace file
   BufferedWriter writer = new BufferedWriter(new FileWriter(traceFile, true /*append*/));
   writer.write("This is a test trace file.");
   writer.close();
                           // Refresh the data so it can seen when the device is plugged in a
                           // computer. You may have to unplug and replug the device to see the 
                           // latest changes. This is not necessary if the user should not modify
                           // the files.
    MediaScannerConnection.scanFile((Context)(this),
                                     new String[] { traceFile.toString() },
                                     null,
                                     null);
   
    }
catch (IOException e)
    {
    Log.e("com.cindypotvin.FileTest", "Unable to write to the TraceFile.txt file.");
    }
}

翻译自: https://www.javacodegeeks.com/2014/06/saving-data-to-a-file-in-your-android-application.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值