zoukankan      html  css  js  c++  java
  • Android数据存储之File

    Android使用与其他平台类似的基于磁盘文件系统(disk-based file systems),上篇文章通过SharedPerference来进行数据存储,这次可以使用File。File 对象非常适合用来读写那种流式顺序的数据,可以用来读写图片文件或者是网络中交换的数据。

    存储位置

    所有的Android设备都有两个文件存储区域:"internal" 与 "external" 存储。 那两个名称来自与早先的Android系统中,那个时候大多数的设备都内置了不可变的内存(internal storage),然后再加上一个类似SD card(external storage)这样可以卸载的存储部件。后来有一些设备把"internal" 与 "external" 的部分都做成不可卸载的内置存储了,虽然如此,但是这一整块还是从逻辑上有被划分。

    Internal storage:总是可用的;这里的文件默认是只能被自己的app所访问的;当用户卸载app的时候,系统会把internal里面的相关文件都清除干净;Internal是在你想确保不被用户与其他app所访问的最佳存储区域。

    External storage:并不总是可用的,因为用户可以选择把这部分作为USB存储模式,这样就不可以访问了;是大家都可以访问的,因此保存到这里的文件是失去访问控制权限的;当用户卸载你的app时,系统仅仅会删除external根目录(getExternalFilesDir)下的相关文件;External是在你不需要严格的访问权限并且你希望这些文件能够被其他app所共享或者是允许用户通过电脑访问时的最佳存储区域。

    Internal storage保存

    保存到手机的internal的时候,需要两种方法去取出文件目录:

    getFilesDir() : 返回一个File,代表app的internal目录。

    getCacheDir() : 返回一个File,代表了app的internal缓存目录。需要确保这个目录下的文件在一旦不再需要的时候能够马上被删除,还要分配一个合理的大小,例如1MB 。如果系统的内部存储空间不够,会自行选择删除缓存文件。

    下面这种方式直接通过openFileOutput,在对应的路径下创建一个文件:

    	 String filename ="testfile";
    		 String string = "FlyElephant!";
    		 FileOutputStream outputStream;
    		
    		 try {
    		 outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
    		 outputStream.write(string.getBytes());
    		 outputStream.close();
    		 } catch (Exception e) {
    		 e.printStackTrace();
    		 }
    

      当然如果你想保存一些缓存文件的时候,就需要调用一下系统的getCacheDir()方法:

    	 File file;
    		 try {
    		 String fileName="CacheTest";
    		 file = File.createTempFile(fileName, ".txt",
    		 MainActivity.this.getCacheDir());
    		 }
    		 catch (IOException e) {
    		 // Error while creating file
    		 }
    

    External storage保存

    刚才保存到Internal中的时候什么都没有配置,需要保存到外部的时候需要配置读写的权限,读的权限READ_EXTERNAL_STORAGE,写的权限:READ_EXTERNAL_STORAGE:

        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

      先来看一段保存到外部存储的代码:

    		if (Environment.getExternalStorageState().equals(
    				Environment.MEDIA_MOUNTED)) {
    			File file = new File(Environment.getExternalStorageDirectory(),
    					"66.txt");
    			try {
    				FileOutputStream fos = new FileOutputStream(file);
    				ObjectOutputStream oos = new ObjectOutputStream(fos);
    				oos.writeObject("FlyElephant");// 写入
    				fos.close(); // 关闭输出流
    			} catch (FileNotFoundException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			Log.i("com.example.googlefile", file.getAbsolutePath());
    

    首先需要判断一下SD卡是不是可用,因为external storage可能是不可用的比如SD卡被拔出,那么你应该在访问之前去检查是否可用。你可以通过执行 getExternalStorageState()来查询external storage的状态。如果返回的状态是MEDIA_MOUNTED, 那么你可以读写。(开始没有判断的时候,一直没有找到报错的原因)

    看到这个获取完之后跟上面保存在内部存储设备的过程一样,下面就不用多说什么了,最后一点就是路径是在/mnt/sdcard目录下,如果是弄成私有文件,不允许外部访问,目录应该是在

    /mnt/sdcard/Android/data/包名 目录下。

    文件存储比较简单,另外说下文件删除吧,保存到外部:

    file.Delete()

    Internal中的删除:

     MainActivity.this.deleteFile("testfile")
  • 相关阅读:
    我为能准时下班而做的准备,以及由此的收获,同时总结下不足
    用象棋的思维趣说IT人的职业发展和钱途
    简历上如果出现过于高大上的项目,反而过犹不及:再论如何通过项目引出技术
    用python的matplotlib和numpy库绘制股票K线均线的整合效果(含从网络接口爬取数据和验证交易策略代码)
    如果当前没有拿得出手的简历,也别慌,努力的话最多两年情况就能改变
    分析若干没面试机会和没体现实力的简历
    IT人为了自己父母和家庭,更得注意自己的身体和心理健康
    Spring Cloud系列文,Feign整合Ribbon和Hysrix
    以互联网公司的经验告诉大家,架构师究竟比高级开发厉害在哪?
    博客园是个大金矿,管理员不挖掘有些可惜:给博客园提一些双赢的建议
  • 原文地址:https://www.cnblogs.com/xiaofeixiang/p/4047340.html
Copyright © 2011-2022 走看看