文件读写操作

  • 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.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();