前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3.数据存储

3.数据存储

作者头像
六月的雨
发布2018-05-14 09:55:09
9420
发布2018-05-14 09:55:09
举报
文章被收录于专栏:Android开发指南

在内部文件的读取

   **内部存储(internal storeage)

     ram:运行时期的内存      (相当于电脑的内存)

     rom;存储的内存     (相当于电脑的硬盘)

   **外部存储(external storeage)

 SD卡:相当于电脑的移动硬盘

* 2.2之前,sd卡路径:sdcard

* 4.3之前,sd卡路径:mnt/sdcard

* 4.3开始,sd卡路径:storage/sdcard

* 所有存储设备,都会被划分成若干个区块,每个区块有固定的大小

* 存储设备的总大小 = 区块大小 * 区块数量

   一般的术语:手机自带的32G,指的是手机的外部存储空间

  •    实例:进行保存用户名和密码:
代码语言:javascript
复制
public void readAccount(){//    	File file = new File(getFilesDir(), "info.txt");    	File file = new File(getCacheDir(), "info.txt");    	if(file.exists()){	    	try {				FileInputStream fis = new FileInputStream(file);				//把字节流转换成字符流				BufferedReader br = new BufferedReader(new InputStreamReader(fis));				//读取txt文件里的用户名和密码				String text = br.readLine();				String[] s = text.split("##");						    	et_name.setText(s[0]);		    	et_pass.setText(s[1]);			} catch (Exception e) {				// TODO Auto-generated catch block				e.printStackTrace();			}    	}    }    public void login(View v){    	    	String name = et_name.getText().toString();    	String pass = et_pass.getText().toString();    	    	CheckBox cb = (CheckBox) findViewById(R.id.cb);    	//判断选框是否被勾选    	if(cb.isChecked()){    		//返回一个File对象,其路径是data/data/com.itheima.apirwinrom/files//    		File file = new File(getFilesDir(), "info.txt");    		    		//返回值也是一个File对象,其路径是data/data/com.itheima.apirwinrom/cache    		File file = new File(getCacheDir(), "info.txt");    		FileOutputStream fos;			try {				fos = new FileOutputStream(file);				fos.write((name + "##" + pass).getBytes());				fos.close();			} catch (Exception e) {				// TODO Auto-generated catch block				e.printStackTrace();			}    	}    	    	//创建并显示吐司对话框    	Toast.makeText(this, "登录成功", 0).show();    }

      注意:

            当内存不足时,系统可能帮我们删除cache中的文件,

    所以一般重要的文件不要放在此文件夹中。

    还有缓存中一般是存放一些内存中一些直接读取的数据。

             手机上有个clear Data:删除的是"该file文件夹"中

             clear cache:删除的是cache缓存中的文件。

在外部存储数据:sd卡

对sdcard进行读取;

  基本的状态:

    MEDIA_UNKNOW:不能够进行识别该sd卡

    MEDIA_REMOVE:没有该sd卡

    MEDIA_UNMOUNTED:sd卡有但是并没有进行挂载

    MEDIA_CHECKING:sd卡正在准备

    MEDIA_MOUNTED:sd卡正在挂载

  • 最简单的打开sd卡的方式 File file = new File("sdcard/info.txt");
  • 写sd卡需要权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  • 读sd卡,在4.0之前不需要权限,4.0之后可以设置为需要 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  • 使用api获得sd卡的真实路径,部分手机品牌会更改sd卡的路径
  • 判断sd卡是否准备就绪
  1. if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ //返回一个File对象,其路径是sd卡的真实路径 File file = new File(Environment.getExternalStorageDirectory(), "info.txt");

查看源代码查找获取sd卡剩余容量的代码

  • 导入Settings项目
  • 查找“可用空间”得到 <string name="memory_available" msgid="418542433817289474">"可用空间"</string>
  • 查找"memory_available",得到 <Preference android:key="memory_sd_avail" style="?android:attr/preferenceInformationStyle" android:title="@string/memory_available" android:summary="00"/>
  • 查找"memory_sd_avail",得到 //这个字符串就是sd卡剩余容量 formatSize(availableBlocks * blockSize) + readOnly //这两个参数相乘,得到sd卡以字节为单位的剩余容量 availableBlocks * blockSize
  • 存储设备会被分为若干个区块,每个区块有固定的大小
  • 区块大小 * 区块数量 等于 存储设备的总大小

Linux文件的访问权限

  • 在Android中,每一个应用是一个独立的用户
  • drwxrwxrwx
  • 第1位:d表示文件夹,-表示文件
  • 第2-4位:rwx,表示这个文件的拥有者用户(owner)对该文件的权限
    • r:读
    • w:写
    • x:执行
  • 第5-7位:rwx,表示跟文件拥有者用户同组的用户(grouper)对该文件的权限
  • 第8-10位:rwx,表示其他用户组的用户(other)对该文件的权限

openFileOutput的四种模式

  • MODE_PRIVATE:-rw-rw----
  • MODE_APPEND:-rw-rw----
  • MODE_WORLD_WRITEABLE:-rw-rw--w-
  • MODE_WORLD_READABLE:-rw-rw-r--

SharedPreference

  • 非常适合用来保存零散的简单的数据
  • Android中主要提供了三种方法用于得到 SharedPreferences对象。 1. Context类中的 getSharedPreferences()方法         因为 getSharedPreferences()方法是Context类中的,所以可以直接这样写。此方法接收两个参数,第一个参数用于指定 SharedPreferences文件的名称,如果指定的文件不存在则会创建一个,第二个参数用于指定操作模式,主要有两种模式可以选择,MODE_PRIVATE和 MODE_MULTI_PROCESS。MODE_PRIVATE仍然是默认的操作模式,和直接传入 0 效果是相同的,表示只有当前的应用程序才可以对这个SharedPreferences文件进行读写。 MODE_MULTI_PROCESS则一般是用于会有多个进程中对同一个SharedPreferences文件进行读写的情况。类似地,MODE_WORLD_READABLE和 MODE_WORLD_WRITEABLE这两种模式已在 Android 4.2版本中被废弃。 2. Activity类中的 getPreferences()方法 这个方法和 Context中的 getSharedPreferences()方法很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为 SharedPreferences的文 件名。 3. PreferenceManager类中的 getDefaultSharedPreferences()方法 这是一个静态方法,它接收一个 Context参数,并自动使用当前应用程序的包名作为前缀来命名 SharedPreferences文件。 储存步骤 得到了SharedPreferences对象之后, 就可以开始向SharedPreferences文件中存储数据了,主要可以分为三步实现。 1. 调用 SharedPreferences对象的 edit()方法来获取一个 SharedPreferences.Editor对象。 2. 向 SharedPreferences.Editor 对象中添加数据,比如添加一个布尔型数据就使用 putBoolean方法,添加一个字符串则使用 putString()方法,以此类推。 3. 调用 commit()方法将添加的数据提交,从而完成数据存储操作。 SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();editor.putString("name", "Tom");editor.putInt("age", 28);editor.putBoolean("married", false);editor.commit(); 用SharedPreference存储账号密码
    • 往SharedPreference里写数据,另一种写法 /路径在data/data/包/share_pre //拿到一个SharedPreference对象 SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE); //拿到编辑器 Editor ed = sp.edit(); //写数据 ed.putBoolean("name", name); ed.commit();
  • 从SharedPreference里取数据 SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE); //从SharedPreference里取数据 String name = sp.getBoolean("name", "");

生成XML文件备份短信

  • 创建几个虚拟的短信对象,存在list中
  • 备份数据通常都是备份至sd卡使用StringBuffer拼接字符串
  • 把整个xml文件所有节点append到sb对象里 StringBuffer sb = new StringBuffer(); sb.append("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>"); sb.append("<messages>"); for (Message sms : smsList) { sb.append("<sms>"); sb.append("<body>"); sb.append(sms.getBody()); sb.append("</body>"); sb.append("<date>"); sb.append(sms.getDate()); sb.append("</date>"); sb.append("<type>"); sb.append(sms.getType()); sb.append("</type>"); sb.append("<address>"); sb.append(sms.getAddress()); sb.append("</address>"); sb.append("</sms>"); } sb.append("</messages>"); File file = new File("sdcard/sms.xml"); try { FileOutputStream fos = new FileOutputStream(file); fos.write(sb.toString().getBytes()); fos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-10-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在外部存储数据:sd卡
  • 查看源代码查找获取sd卡剩余容量的代码
  • Linux文件的访问权限
  • openFileOutput的四种模式
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档