文件存储相关
I/O流
按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。
从流中取得数据的方式称为提取操作,向流中添加数据的操作称为插入操作。
IO流就是以流的方式进行输入输出。
输入流与输出流
输入流:程序从输入流读取数据
输出流:程序向输出流写数据
文件读取
操作使用类
FileInputStream和FileOutputStream
读写原理
1、所有文件的存储都是以字节的方式存储。
2、磁盘中存储的并不是文件的字符,而是将字符编码成字节,再存储到磁盘。
3、在读取文件时,是一个字节一个字节的读取 以形成字节序列。
读写步骤
1、建立通道
2、定义存储空间
3、读写数据
4、先执行flush( )方法(清空缓冲区数据),然后关闭流
File类
获取路径
getExternalFilesDir(type:String )的说明
1、该方法用于获得外部存储,地址为/storage/emulated/0/Android/data/packageName/files
注:packageName:app包名
2、该方法可传一个String类型的参数,表述为该路径下的文件夹,没有该文件夹会自动创建
val path: String = context.getExternalFilesDir(null)!!.absolutePath
val file: File = File(path)
//输出:path:/storage/emulated/0/Android/data/packageName/files
val path2: String = context.getExternalFilesDir("UniApp")!!.absolutePath
val file2: File = File(path2)
//path:/storage/emulated/0/Android/data/packageName/files/UniApp
// 如uniapp文件夹没有,则会自动创建
val path3: String = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)!!.absolutePath
val file3: File = File(path3)
//path:/storage/emulated/0/Android/data/packageName/files/Download
val path4: String = context.getExternalFilesDir("")!!.absolutePath + "/hhhhhh"
val file4: File = File(path4)
//path:storage/emulated/0/Android/data/packageName/files/hhhhhh
// 如果没有“hhhhhh”文件夹,则file4.exists()==false
创建文件夹
mkdir( ):只可以在已有的父文件夹下面创建子文件夹,如果无父文件夹,那么就无法创建子文件夹(只会建立一级文件夹)
File("/tmp/one/two/three").mkdir()
//不会建立任何目录, 因为找不到/tmp/one/two目录, 结果返回false
mkdirs( ):可以在父文件夹不存在的情况下,创建子文件夹,顺便将父文件夹也创建了;而如果父文件夹已存在,则对新的父文件夹下的子文件夹的创建没有影响,新的子文件夹依旧是可以照常创建的(可以建立多级文件夹)
File("/tmp/one/two/three").mkdirs()
//执行后, 会建立tmp/one/two/three四级目录
创建文件
creatNewFile( ):返回值为Boolean
当且仅当不存在具有此抽象路径名指定名称的文件时,才可以创建一个新的空文件。
- 当test目录下不存在1.txt文件时,会创建一个新的空文件。
- 当test目录不存在时,会抛出异常。
- 当test目录下存在1.txt文件时,会创建失败。
val res :Boolean = File("D:\\test\\1.txt").createNewFile()
Android存储
当前Android分为内部存储和外部存储(手机自带),同时还可以插入sd卡来扩展内存。
注意:所有的安卓设备都有外部存储和内部存储,这两个名称来源于安卓的早期设备,那个时候的设备内部存储确实是固定的,而外部存储确实是可以像U盘一样移动的。但是在后来的设备中,很多中高端机器都将自己的机身存储扩展到了8G以上,他们将存储在概念上分成了"内部internal" 和"外部external" 两部分,但其实都在手机内部。所以不管安卓手机是否有可移动的sdcard,他们总是有外部存储和内部存储。最关键的是,我们都是通过相同的api来访问可移动的sdcard或者手机自带的存储(外部存储)
外部存储虽然概念上有点复杂,但也很好区分,你把手机连接电脑,能被电脑识别的部分就一定是外部存储。
权限
存储(也就是write)私有目录和公共媒体文件都不需要WRITE_EXTERNAL_STORAGE权限
读取 (也就是read)私有目录不需要READ_EXTERNAL_STORAGE权限,读取公共媒体文件需要READ_EXTERNAL_STORAGE权限(应用只能访问自己沙盒下的文件和公共媒体文件)
app自己沙盒
Android Q (安卓10)文件存储机制修改成了沙盒模式。
getExternalFilesDir(App自身目录下的文件夹(Android/data/包名/fils) )
- App卸载后,数据会清除
- App访问自己的App-specific目录时无需任何权限
- 可以使用FileProvider分享使用自己私有目录的文件
公共媒体文件
公共目录:Downloads、Documents、Pictures、DCIM、Movies、Music、Ringtones等
地址:/storage/emulated/0/Downloads(Pictures)等
- App卸载后,不会删除
- App可以通过SAF框架(System Access Framework)、MediaStore接口访问其中的文件
- 无法直接使用路径访问公共目录文件