Android内/外部存储文件读写操作总结

文件读写操作

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值