Android的文件读写有两种,一种是默认的Java文件流,一种是对SD卡的读写。
第一种:File
打开输入: FileInputStream openFileInput(String name)
打开应用程序的数据文件夹(默认目录)下的name文件对应的输入流
打开输出:FileOutputStream openFileOutput(String name, int mode)
打开应用程序的数据文件夹(默认目录)下的name文件对应的输出流
1)默认目录:一般默认目录是/data/data//files目录
2)String name:是文件名,非文件全路径。openFilexxx函数只接受文件名作为输入,如果是路径,则会跑出参数错误异常,描述是文件名包含了分隔符
3)这种方式没有activity的权限限制(即不需要mainfast中的权限配置),也因为别的APP无法访问目录下的文件,加强了安全性;仅可以通过contentProvider提供访问
4)猜测:机身内存一般都很少,2-3G,该文件夹保存的文件一般应该是在机身内存,所以APP一般把生成的文件都保存到SD卡上(内置或外置卡)
后语:拿到输入输出流后,就可以像普通Java文件IO一样进行读写操作了
第二种:SD卡
步骤(摘自《疯狂Android讲义》):
1)调用Environment的getExternalStorageState()判断手机上是否插入了SD卡,并且应用程序具有读写SD卡的权限。例如:
Enviroment.getExternalStorageState().equals(Enviroment.MEDIA_MOUNTED)
我在这里范了一个错误,用”==“而不是equals进行比较,结果怎么比较都是失败。。。
2)调用Environment的getExternalStorageDirectory()方法获取外部存储器,也就是SD卡的目录。
我的手机是内置SD卡(可插外置内存卡),看网上的说法,有人测试了不同手机,当手机可以具有内外SD卡功能时,这个函数可能返回内置SD卡路径,也可能返回外置SD卡路径,我手机只有内置SD卡,所以没有测试双内存卡的情况。一般显示路径是/storage/emulated/0,而他是一个链接,指向/storage/emulated/legacy,这也是一个链接,实际指向/mnt/shell/emulated/0,这里才是SD卡在Linux中的真正挂载点。不过上面的方法返回的是第一个路径。
3)使用FileInputStream、FileOutputStream、FileReader、FileWriter读写SD卡里的文件
如FileInputStream fis = new FileInputStream(SD卡路径+filename);
这里就不能用openFileStream了
读写SD卡的时候,一定要配置权限:
MOUNT_UNMOUNT_FILESYSTEMS
WRITE_EXTERNAL_STORAGE