Android开发之Saving Files

更多分享: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;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容