在内部文件的读取
**内部存储(internal storeage)
ram:运行时期的内存 (相当于电脑的内存)
rom;存储的内存 (相当于电脑的硬盘)
**外部存储(external storeage)
SD卡:相当于电脑的移动硬盘
* 2.2之前,sd卡路径:sdcard
* 4.3之前,sd卡路径:mnt/sdcard
* 4.3开始,sd卡路径:storage/sdcard
* 所有存储设备,都会被划分成若干个区块,每个区块有固定的大小
* 存储设备的总大小 = 区块大小 * 区块数量
一般的术语:手机自带的32G,指的是手机的外部存储空间
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卡是否准备就绪
- 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)对该文件的权限
- 第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(); }