更多分享:http://www.cherylgood.cn
android开发中本地存储数据主要有三种方式:
- 1、SharedPreferences 存储的信息量相对较小的情况下推荐使用。该方式采用key/value的形式进行存储,多见于保存配置信息之类的。
- 2、Saving Data in SQL Databases 数据存储到数据库中,Android中使用SQLite。
- 3、Saving File 数据保存在文件中,也是本次主要学习的内容
File 对象适合按照从开始到结束的顺序不跳过地读取或写入大量数据。 例如,它适合于图片文件或通过网络交换的任何内容。
- 存储分为内部存储和外部存储:Android设备都有两个文件存储区域.
摘录自google:
所有 Android 设备都有两个文件存储区域:“内部”和“外部”存储。这些名称在 Android 早期产生,当时大多数设备都提供内置的非易失性内存(内部存储),以及移动存储介质,比如微型 SD 卡(外部存储)。一些设备将永久性存储空间划分为“内部”和“外部”分区,即便没有移动存储介质,也始终有两个存储空间,并且无论外部存储设备是否可移动,API 的行为均一致。以下列表汇总了关于各个存储空间的实际信息。
内部存储:
- 始终可用。
- 只有你的应用可以访问本应用存储在内部存储中的文件。
- 当应用程序被卸载时,属于该应用的内部存储中的文件也会被移除。
外部存储:
非实时可用,假如外部存储为移动存储介质时,受用户的挂载影响。
外部存储的数据是公开的,其他应用也可以读取。
当应用被卸载时,由该应用在外部存储中创建的文件不会自动被移除,需用户自己操作移除,只有通过getExternalFilesDir() 方法获取存储目录进行文件操作时,系统才会将该目录与你的应用联系起来,在应用卸载时,将文件一起移除。
注:在 Android N 之前,内部文件可以通过放宽文件系统权限让其他应用访问。而如今不再是这种情况。如果您希望让其他应用访问私有文件的内容,则您的应用可使用
外部存储
-
1、在向外部存储读取文件前,先要申请相关权限:写权限是包含了读权限的
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAG E" />
...
</manifest> 2、在向外部存储读写文件前,我们应该线检测外部存储是否可用:
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
通过使用Environment.getExternalStorageState()方法判断外部存储是否可用
-
getExternalStoragePublicDirectory 获取外部公共存储目录调用时传递参数Environment.DIRECTORY_PICTURES 或者Environment.DIRECTORY_MUSIC来确定获取的事pictures目录还是music目录,同时传递文件名进行文件的创建或者读取,应用卸载时,不移除创建的文件。
File file = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), fileName);
-
getExternalFilesDir() 如果你希望应用卸载时自动移除外部存储创建的文件,可以调用getExternalFilesDir()方法,第一个参数为null时,直接获取外部存储根目录
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; }
内部存储
在向内部存储中读取文件时则不需要额外申请权限。
- 在内部存储中操作文件时,你可以通过getFileDir()方法(返回file表示你应用内部根目录/data/data/xxx.xxx.xxx/)或者getCacheDir()(返回表示你的应用临时缓存文件的内部目录的 File。 )
注:在使用getCachDir()时,需要及时删除所有不再需要的文件并在指定时间对使用的内存量实现合理大小限制,比如,1MB。 如果系统即将耗尽存储,它会在不进行警告的情况下删除该目录下的文件。
获取示例:
File file = new File(context.getFilesDir(), filename);
之后还要调用file.mkdirs()哦
也可以调用 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();}
对文件进行缓存:
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;
}