在Android中读写文件
- RAM:运行内存,相当于电脑的内存
- ROM:内部存储空间,相当于电脑的硬盘
- Android手机必须有的
- SD卡:外部存储空间,相当于电脑的移动硬盘
- 不是必须的
- 现在手机自带的空间都属于外部存储,然后手机基本内部外部共享同一个存储设备
内部存储路径
- 所有安装至手机的应用都会在data/data目录下生成一个包名文件夹,这个文件夹就是内部存储的路径
- 应用只能在自己的包名文件夹中读写文件
- getFilesDir()内部存储路径获取 // data/data/包名/files
- File file = new File(getFilesDir(),"文件名.后缀");
- getCacheDir() //data/data/包名/cache 内部存储空间不足时,cache文件夹中的内容会被删除
外部存储路径
- Environment.getExternalStorageDirectory()
- Environment.getExternalStorageState() //返回sd卡的状态,常用的有:
- MEDIA_REMOVED:sd卡不存在
- MEDIA_UNMOUNTED:sd卡存在,但是没有挂载,
- MEDIA_CHECKING:sd卡正在遍历,
- MEDIA_MOUNTED:sd卡可用
- if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) //判断sd卡是否可用
获取sd卡空间
- 存储设备会被分为若干个区块
- 每个区块的大小 * 区块总数 = 存储设备的总大小
- 每个区块的大小 * 可用区块的数量 = 存储设备可用大小
- File path = Environment.getExternalStorageDirectory();
- StatFs stat = new StatFs(path.getPath());
- long blockSize = stat.getBlockSize(); //每个区块的大小
- long totalBlocks = stat.getBlockCount(); //区块总数
- long availableBlocks = stat.getAvailableBlocks(); //可用区块的数量 #### 4.3以上用:
- long blockSize = stat.getBlockSizeLong(); //每个区块的大小
- long totalBlocks = stat.getBlockCountLong(); //区块总数
- long availableBlocks = stat.getAvailableBlocksLong(); //可用区块的数量
- private String formatSize(long size){ //格式化文件大小
- reutrn Formatter.formatFileSize(this,size);
- }
判断当前应用sdk的版本
- if(Build.VERSION.SDKINT >= Build.VERSIONCODES.JELLYBEANMR2) //例如判断当前是否大于等于18
文件访问权限
- 每一个应用都是一个用户
- drwxrwxrwx
-
第一个字母 d
- d:表示文件夹
- -:表示文件
- l:快捷方式
-
第一组rwx:文件拥有者(owner)的权限
- r:读
- w:写
- X:执行execute
-
第二组rwx:与文件拥有者同一用户组的用户(grouper)
-
第三组rwx:其化用户(other)的权限
SharedPreference
- 以键值对的形式保存数据
- 适合存放零散简单的数据
- 原理其实是生成xml文件去保存
xml序列化器
//获取xml序列化器
XmlSerializer xs = Xml.newSerializer();
File file = new File(Environment.getExternalStorageDirectory(), "sms.xml");
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
//初始化
//xml文件用什么编码生成
xs.setOutput(fos, "utf-8");
//开始生成xml文件
//生成头节点
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.endTag(null, "body");
xs.startTag(null, "date");
xs.text(sms.getDate() + "");
xs.endTag(null, "date");
xs.startTag(null, "type");
xs.text(sms.getType() + "");
xs.endTag(null, "type");
xs.startTag(null, "address");
xs.text(sms.getAddress());
xs.endTag(null, "address");
xs.endTag(null, "sms");
}
xs.endTag(null, "smss");
//告知序列化器生成xml结束
//生成尾节点
xs.endDocument();
} catch (Exception e) {
e.printStackTrace();
}