文件读写操作
- RAM内存:运行内存,这直接决定了手机后台能开多少程序
- ROM内存:内部存储空间,一部分空间用于存储系统,一部分空间用于存储自带APK,剩下空间供用户使用。
- SD卡:外部存储空间,将sd卡作为一个子文件夹(linux:一切皆文件)
- Internal Storage 和 SDcard 的区别?使用API访问的时候是否有区别?这两种存储在文件结构中的体现(目录)是什么?
读写内部存储(“data/data/应用包名/”)下的文件:
- 当应用程序在安装时就会分配一个UID(存储于“data/system/packages.list”),当该应用要去访问其他资源比如文件的时候,就需要UID匹配。
- 默认情况下,任何应用创建的文件、数据库、SharedPreferences都应该是私有的,其余程序无法访问。除非在创建时指明是MODE_WORLD_READABLE 或 MODE_WORLD_WRITEABLE,只有这样其余程序才能访问。
- 此目录下有两个文件夹 , cache和files,官方对于cache的解释是“These files will be ones that get deleted first when the device runs low on storage”,那么很明显files下的文件是会永久保存的。你可以使用getCacheDir()和getFilesDir()来分别得到这两个文件夹的路径。
以文件的形式读写:
- 文件存放在 /data/data/应用包名/files/
写数据:
FileOutputStream fos = openFileOutput("info.txt",MODE_PRIVATE); fos.write((accountStr + "&&" + passowordStr).getBytes()); fos.close();
读数据:(问题:在读文件之前应该判断这个文件是否存在,唯一的办法就是File.exist(),可是使用openFileInput()就是为了避开使用File?这个问题怎么解决?)
FileInputStream fis = openFileInput("info.txt"); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String text = br.readLine(); String s[] = text.split("&&");
SharedPreference
- 主要用于保存配置信息,类似于Win平台下的ini文件
- 以键值对的形式保存于xml文件中,文件存放在 /data/data/包名/shared_prefs/
- putxxx() 方法,若存在该键,则覆盖其值;否则追加。
写数据:
SharedPreferences sp = getSharedPreferences("info", MODE_PRIVATE); Editor ed = sp.edit(); ed.putString("account", account); ed.putString("password", passoword); ed.putString("sex", sex); ed.commit();
读数据:
SharedPreferences sp = getSharedPreferences("info", MODE_PRIVATE); String account = sp.getString("account", "NotGet"); String password = sp.getString("password", "NotGet"); String sex = sp.getString("sex","NotGet");
读写外部存储(SDcard)的文件
- 在linux中,“mnt/”主要用于挂载其他文件系统。对于外部存储,安卓系统2.2之前路径是“/sdcard” ; 系统版本2.2~4.2的路径是“/mnt/sdcard” ; 系统版本4.3开始路径是“/storage/sdcard” 。这三个路径都会被挂载到“/storage/emulated/0”目录(或者“/storage/emulated/legacy”,这两个目录是一样的) 。
代码中获得外部存储路径的标准做法是 :
// 判断SD卡是否可用 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { // 获取SD卡路径 String sdcardPath = Environment.getExternalStorageDirectory().getAbsolutePath(); //Do Something... }
获取SDcard容量:(存储设备会被分成若干区块 , 每个区块的大小 * 可用区块数 = 存储设备可用大小)
File path = Environment.getExternalStorageDirectory(); StatFs stat = new StatFs(path.getPath()); long blockSize = stat.getBlockSize(); long availableBlocks = stat.getAvailableBlocks(); // 格式化显示SDcard剩余容量 String mSdAvail = Formatter.formatFileSize(this,blockSize * availableBlocks);
写数据:(sdcardPath由以上代码得到)
FileOutputStream fos = new FileOutputStream(sdcardPath + "/mp3/info.txt"); //fos.write......
读数据:
File file = new File(sdcardPath + "/mp3/info.txt"); if(file.exists()){ FileInputStream fis = new FileInputStream(file); //BufferedReader br =...... }
配置权限:(第一个:往sdcard中写入数据的权限 ; 第二个:往sdcard中创建/删除文件的权限)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
文件访问权限:(drwxrwxrwx)
- 第一个字母:
- d :表示文件夹
-
- :表示文件
- 第一组字母rwx:文件拥有者的权限(owner)
- r : 读权限(read)
- w :写权限(write)
- x :执行权限(execute)
- 第二组rwx:与文件拥有者同一用户组的用户的权限(grouper)
- 第三组rwx:其他用户的权限(other)
- 安卓系出于linux,在Android中,每一个应用,都是一个独立的用户,他们也并不属于同一个用户组
- openFileOutput() 的第二个参数可以设置文件的权限
安卓文件读写操作的文章:
* http://blog.csdn.net/ztp800201/article/details/7322110
* http://blog.sina.com.cn/s/blog_4d25c9870100qpax.html
xml序列化器
将键值对信息保存到xml文件中
File file = new File("sdcard/sms2.xml"); XmlSerializer xs = Xml.newSerializer(); FileOutputStream fos = new FileOutputStream(file); xs.setOutput(fos, "utf-8"); xs.startDocument("utf-8", true); xs.startTag(null, "smss"); for(Sms sms : smslist){ xs.startTag(null, "sms"); xs.startTag(null, "body"); xs.text(sms.getBody()); xs.startTag(null, "body"); xs.startTag(null, "data"); xs.text(sms.getData()); xs.startTag(null, "data"); xs.startTag(null, "address"); xs.text(sms.getAddress()); xs.startTag(null, "address"); xs.endTag(null, "sms"); } xs.endTag(null, "smss"); // 告知序列化器生成xml结束 xs.endDocument();