前言
最近过年刚上来, 打算把自己的 Android 知识都整理一下
Android 技能书系列:
Android 技能树 动画小结
Android 技能树 View 小结
Android 技能树 Activity 小结
Android 技能树 View 事件体系小结
这次是讲 Android 存储路径及 IO 的基本操作因为我们在开发的时候会经常这种方便的需求这篇文章的内容我写的可能很少, 都没有细写别吐槽 o(︶)o
其他不多说, 先上脑图:
Android 存储 下载
IO 操作 下载
Android 存储路径
脑图列举的是比较常用的可能哪里会有不全, 大家也可以反馈我可以再修改
Android 存储路径
我这里分为内部存储和外部存储, 其中这里的外部存储指了手机内部的 SDCard, 很多手机可能额外还有扩展卡内存, 可以增加扩展卡 (外置 SDCard), 这里我不做说明了
内部存储
其实我们用到的最多的 / data 目录下的
我们可以看到这里的注意点, 因为以前我们的路径一般是 / data/data/xxxx, 但是比如我用的是小米的 6.0 系统的手机, 我打印出来的就是 / data/user/0/xxxx
我们可以具体看 / data 目录下的 / app 及 / data 这二个子目录的功能:
具体我也就不细说了脑图也已经写得也清楚了
而内部存储下的 / system 和 / cache 目录相对用到的很少了解就可以
外部存储
我们可以看到, 在对外部存储进行读写操作的时候, 我们需要申请相关的权限记不记得这二个很眼熟的权限:
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
因为现在手机都是内置了 SDCard 所以我们在实际开发中, 很少去调用
Environment.getExternalStorageState()
去判断当前 SD 卡是否正常挂载当然最好还是去判断下, 然后再去操作相关的外部存储代码
具体下面的目录, 我也就不多说了直接看脑图即可
为了大家方便记忆, 我们可以这么记, 就是我们存相关数据在相应的自己的 app 包名下的地方, 不管是内部存储还是外部存储, 都是调用 context.getXXXX() 方法, 毕竟是跟我们的 APP 相关的, 代码里面直接用 context 来获取如果是一些共用的目录, 说明本身就是存在的, 直接用
Environment.getXXXX()
来获取即可
IO 操作
其实 IO 操作平常开发时候遇到的也就是文件的复制, 或者是文本的写入这二块所以大致的使用到的如下图所示:
具体的我也不多说了这里有一篇不错的文件, 推荐一下:
java 中的 IO 操作总结
字节流 (实现文件的复制):
不使用缓冲:
- String source = "xxxxx/xxxxx/source.mp4";
- String target = "xxx/xxxx/target.mp4";
- FileOutputStream outputStream = null;
- FileInputStream inputStream = null;
- try {
- outputStream = new FileOutputStream(target);
- inputStream = new FileInputStream(source);
- int temp = 0;
- byte[] buf = new byte[1024];
- while ((temp = inputStream.read(buf)) != -1){
- outputStream.write(buf,0,temp);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }finally {
- if(inputStream != null){
- try {
- inputStream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- if(outputStream != null){
- try {
- outputStream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
使用缓冲
- String source = "xxxxx/xxxxx/source.mp4";
- String target = "xxx/xxxx/target.mp4";
- FileOutputStream outputStream = null;
- FileInputStream inputStream = null;
- BufferedOutputStream bufferedOutputStream = null;
- BufferedInputStream bufferedInputStream = null;
- try {
- outputStream = new FileOutputStream(target);
- inputStream = new FileInputStream(source);
- bufferedOutputStream = new BufferedOutputStream(outputStream);
- bufferedInputStream = new BufferedInputStream(inputStream);
- int temp = 0;
- byte[] buf = new byte[1024];
- while ((temp = bufferedInputStream.read(buf)) != -1){
- bufferedOutputStream.write(buf,0,temp);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }finally {
- if(bufferedInputStream != null){
- try {
- bufferedInputStream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- if(bufferedOutputStream != null){
- try {
- bufferedOutputStream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
字符流 (实现文件内容的复制):
不使用缓冲:
- String source = "xxxxx/xxxxx/source.txt";
- String target = "xxx/xxxx/target.txt";
- FileReader reader = null;
- FileWriter writer = null;
- try {
- reader = new FileReader(source);
- writer = new FileWriter(target);
- int temp = 0;
- // 单字符写入
- while ((temp = reader.read()) == -1) {
- writer.write(temp);
- }
- // 字符数组方式写入
- int temp1 = 0;
- char[] buf = new char[1024];
- while ((temp1 = reader.read(buf)) != -1) {
- writer.write(new String(buf, 0, temp1));
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (reader != null) {
- try {
- reader.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- if (writer != null) {
- try {
- writer.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
使用缓冲:
- String source = "xxxxx/xxxxx/source.txt";
- String target = "xxx/xxxx/target.txt";
- FileReader reader = null;
- FileWriter writer = null;
- BufferedReader bufferedReader = null;
- BufferedWriter bufferedWriter = null;
- try {
- reader = new FileReader(source);
- writer = new FileWriter(target);
- bufferedReader = new BufferedReader(reader);
- bufferedWriter = new BufferedWriter(writer);
- String content = null;
- //readLine() 方法只返回换行符之前的数据
- while ((content = bufferedReader.readLine()) != null) {
- bufferedWriter.write(content);
- // 写完文件内容之后换行, windows 下的换行是 \ r\n,Linux 下则是 \ n
- bufferedWriter.newLine();
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (bufferedReader != null) {
- try {
- bufferedReader.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- if (bufferedWriter != null) {
- try {
- bufferedWriter.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
结语
我也不知道写啥希望大家轻点喷就对了
来源: https://juejin.im/post/5a8fc6105188257a7349db4e