Android数据存储

Android数据存储,第1张

概述1.使用内部存储 Android系统能够直接把文件存在设备的内部存储内。 默认情况下,保存在内部存储内的文件是应用程序私有的,其他应用程序(或用户)是无法访问的。 当用户卸载此应用程序时,内部存储的数 1.使用内部存储  AndroID系统能够直接把文件存在设备的内部存储内。

  默认情况下,保存在内部存储内的文件是应用程序私有的,其他应用程序(或用户)是无法访问的。

  当用户卸载此应用程序时,内部存储的数据会一并清除。

往内部存储内写文件(写入到/data/data/com.xxx.xxx/files目录下,com.xxx.xxx为应用程序包名):@H_419_20@[java] view plaincopyString file_name = "hello_file";  @H_419_20@String file_TEXT = "hello world!!!";  @H_419_20@fileOutputStream fos = openfileOutput(file_name, Context.MODE_PRIVATE);  @H_419_20@fos.write(file_TEXT.getBytes());  @H_419_20@fos.close();  @H_419_20@@H_419_20@

      MODE_PRIVATE参数指示要创建这个文件(或者,如果有同名文件存在,则会替换旧文件),并且让这个文件是应用程序的私有文件。

     其他可用的模式包括:MODE_APPEND(如果文件已经存在,则在后面追加数据)、MODE_WORLD_READABLE(让其他应用有读的权 

     限)和MODE_WORLD_WRITEABLE(让其他应用有写的权限)。

    注:MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE已经在AndroID 4.2(API level 17)废弃了,因为这样危险,安全性不

         高。

     运行上面代码,发现/data/data/com.xxx.xxx/files目录下多了个hello_file文件。

  

读取内部存储内的文件(也就是从/data/data/com.xxx.xxx/files目录下读取文件)@H_419_20@[java] view plaincopyString file_name = "hello_file";  @H_419_20@byte[] b = new byte[1024];  @H_419_20@StringBuffer sb = new StringBuffer();  @H_419_20@fileinputStream fis = openfileinput(file_name);  @H_419_20@int num;  @H_419_20@while ((num = fis.read(b)) != -1) {  @H_419_20@    sb.append(new String(b, 0, num));  @H_419_20@}  @H_419_20@fis.close();  @H_419_20@Log.d("xxx", sb.toString());  @H_419_20@
运行一下,成功打印Hello World!!!
另外,介绍几个和内部存储相关的方法@H_419_20@

//打印出/data/data/com.xxx.xxx/files

Log.d("xxx",getfilesDir().toString());

//打印出/data/data/com.xxx.xxx/app_hello_file

Log.d("xxx",getDir("hello_file",Context.MODE_PRIVATE).toString());

//返回应用程序内部存储(也就是/data/data/com.xxx.xxx/files目录下)当前保存文件列表

for (int i = 0; i < fileList().length; i++) {
            Log.d("xxx",fileList()[i]);

}

//删除保存在内部存储上(也就是/data/data/com.xxx.xxx/files目录下)的文件

deletefile("hello_file");

@H_419_20@在内部存储内保存缓存文件(/data/data/com.xxx.xxx/cache/com.androID.renderscript.cache目录下)@H_419_20@

如果只是要缓存一些数据,而不是要持久的保存它,那么应该使用getCacheDir()方法来打开一个file对象,它代表了应用程序要保存临时缓存文件的内部目录。

当设备的内部存储空间不足的时候,AndroID可能会删除这些缓存文件来回收存储空间。但是,不应该依赖系统来给你清理这些文件,应该始终自己来维护缓存文件,并且要把存储空间的耗费限定在合理的范围内,如1MB。当用户卸载应用程序时,这些文件会被删除

往内部缓存内写文件与读文件的例子,只要把上面的两个例子中的openfileOutput(file_name,Context.MODE_PRIVATE)和openfileinput(file_name)分别改为new fileOutputStream(getCacheDir() + file.separator + file_name)和new fileinputStream(getCacheDir() + file.separator + file_name)即可。

@H_419_20@2.使用外部存储sdcard检查外部存储的可用性@H_419_20@

在用外部存储器工作之前,应该始终调用getExternalStorageState()方法来检查存储介质是否可用。存储介质可能被挂载在一个丢失的、或是只读等其他状态的计算机上。以下是检查可用性的方法:

[java] view plaincopyboolean mExternalStorageAvailable = false;  @H_419_20@boolean mExternalStorageWriteable = false;  @H_419_20@String state = Environment.getExternalStorageState();  @H_419_20@  @H_419_20@if (Environment.MEDIA_MOUNTED.equals(state)) {  @H_419_20@    // We can read and write the media  @H_419_20@    mExternalStorageAvailable = mExternalStorageWriteable = true;  @H_419_20@} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {  @H_419_20@    // We can only read the media  @H_419_20@    mExternalStorageAvailable = true;  @H_419_20@    mExternalStorageWriteable = false;  @H_419_20@} else {  @H_419_20@    // Something else is wrong. It may be one of many other states, but all we need  @H_419_20@    //  to kNow is we can neither read nor write  @H_419_20@    mExternalStorageAvailable = mExternalStorageWriteable = false;  @H_419_20@}  @H_419_20@这个例子检查了外部存储器是否可用于读写。你可能还想要检查getExternalStorageState()方法的其他状态,如存储介质是否是共享的(被连接到一个计算机上),是否完全丢失、是否被恶意的删除等等。使用这些状态,在应用程序需要访问存储介质时,以便给用户提供更多的通知信息
往外部存储内写文件和删文件和判断文件是否存在(写入到/mnt/sdcard/AndroID/data/com.xxx.xxx/files目录下,com.xxx.xxx为应用程序包名):@H_419_20@
[java] view plaincopy//要加权限<uses-permission androID:name="androID.permission.WRITE_EXTERNAL_STORAGE"/>  @H_419_20@voID createExternalStoragePrivatefile() {  @H_419_20@    file file = new file(getExternalfilesDir(null), "Demofile.jpg");  @H_419_20@    try {  @H_419_20@        inputStream is = getResources().openRawResource(R.drawable.balloons);  @H_419_20@        OutputStream os = new fileOutputStream(file);  @H_419_20@        byte[] data = new byte[is.available()];  @H_419_20@        is.read(data);  @H_419_20@        os.write(data);  @H_419_20@        is.close();  @H_419_20@        os.close();  @H_419_20@    } catch (IOException e) {  @H_419_20@        Log.w("ExternalStorage", "Error writing " + file, e);  @H_419_20@    }  @H_419_20@}  @H_419_20@  @H_419_20@//要加权限<uses-permission androID:name="androID.permission.MOUNT_UNMOUNT_fileSYstemS"/>  @H_419_20@voID deleteExternalStoragePrivatefile() {  @H_419_20@    file file = new file(getExternalfilesDir(null), "Demofile.jpg");  @H_419_20@    if (file != null) {  @H_419_20@        file.delete();  @H_419_20@    }  @H_419_20@}  @H_419_20@  @H_419_20@boolean hasExternalStoragePrivatefile() {  @H_419_20@    file file = new file(getExternalfilesDir(null), "Demofile.jpg");  @H_419_20@    if (file != null) {  @H_419_20@        return file.exists();  @H_419_20@    }  @H_419_20@    return false;  @H_419_20@}  @H_419_20@

getExternalfilesDir()方法有一个参数,如果传递null,则会得到应用程序的文件目录的根目录。如果传入其他(例如Environment.DIRECTORY_PICTURES)则会在/mnt/sdcard/AndroID/data/com.xxx.xxx/files目录下创建相应的文件夹(例如pictures文件夹),可以把上面的null替换成Environment.DIRECTORY_PICTURES试试

同样,在卸载应用的时候,文件会被删除

同样,这些文件是应用程序私有的

在外部存储内保存缓存文件(/mnt/sdcard/AndroID/data/com.xxx.xxx/cache目录下)@H_419_20@

例子的话只需要把上面例子中的getExternalfilesDir(null)替换为getExternalCacheDir()

同样,在卸载应用的时候,文件会被删除

同样,这些文件是应用程序私有的

在外部存储上保存共享文件@H_419_20@

如果保存的文件不是应用程序所专有的,并且在应用程序被卸载时,不删除这些文件,那么就要把它们保存到外部存储器上的一个公共的目录上。这些目录位于外部存储器的根目录,如下:

Music/---媒体扫描器把在这个目录中找到所有媒体文件作为用户音乐。

podcasts/---媒体扫描器把在这个目录中找到的所有媒体文件作为音/视频的剪辑片段。

ringtones/---媒体扫描器把在这个目录中找到的所有媒体文件作为铃声。

Alarms/---媒体扫描器把在这个目录中找到的所有媒体文件作为闹钟的声音。

Pictures/---所有的图片(不包括那些用照相机拍摄的照片)。

MovIEs/---所有的电影(不包括那些用摄像机拍摄的视频)。
Download/---其他下载的内容。

例子的话只需要把上面例子中的getExternalfilesDir(null)替换为Environment.getExternalStoragePublicDirectory(),此方法需要一个参数来指定公共目录类型(如Environment.DIRECTORY_MUSIC、Environment.DIRECTORY_PICTURES、Environment.DIRECTORY_ringtoneS或其他的类型。如果需要,这个方法会创建适当的目录)

总结

以上是内存溢出为你收集整理的Android数据存储全部内容,希望文章能够帮你解决Android数据存储所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1119321.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存