Android 文件存储

98 阅读2分钟

一、外部存储

1、我们通过 Environment.getExternalStorageDirectory().getAbsolutePath() 获取外部绝对路径

**

        //        获取外部存储中名字叫imooc.txt的路径
        String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/imooc.txt";
        //创建文件
        File file = new File(path);

2、接着我们需要判断文件是否存在,如果不存在,就创建,存在就继续往下走

**

          //判断文件是否存在
          if (!file.exists()) {
                file.createNewFile();
            }

3、通过输出流写入自己想要写入的信息,这儿我写入的是字符串信息

**

try {
            if (!file.exists()) {
                file.createNewFile();
            }
            //建立输出流 ,这儿讲一下第二个参数 ,设为true 表示后面写入的数据会进行拼接 。举个例子 ,我第一次写入数据为:"Hello" ,第二次在写入数据 "World" ,最终就会拼接成 "Hello World" ,如果不想拼接 可以不填。
            FileOutputStream fileOutputStream = new FileOutputStream(file, true);
            String aaa = "哈哈哈哈哈哈哈";
            //通过字节的方式写入数据
            fileOutputStream.write(aaa.getBytes());
            //写入完毕记得关闭输出流
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

4、这个时候就已经写入了,我们可以在Android 右下角点击DeviceFileExplorer 中查看 文件在sdcard 目录下

image.png

这就是我们刚才写入的imooc.txt 文件,这儿需要足以的是在Android 6.0 以后不但需要在AndroidManifest 中配置权限,还需要动态获取读写权限 在AndroidManifest.xml 文件中配置权限

**

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

而动态获取权限需要涉及到两个函数 ContextCompat.checkSelfPermission() 和 ActivityCompat.requestPermissions() ,其中 ContextCompat.checkSelfPermission() 作用: 检查是否拥有某个权限 , ActivityCompat.requestPermissions() 表示申请权限:

**

  //申请动态权限
 private void permission() {
        //首先判断是否拥有某个权限 ,返回值为int 类型,如果值等于PackageManager.PERMISSION_GRANTED表示有这个权限,没有就申请
        int i = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (i != PackageManager.PERMISSION_GRANTED) {
            //申请权限有三个参数 参数一: 表示上下文。参数二 :表示权限的集合 参数三:表示状态码 用于onRequestPermissionsResult回调 ,就是对应onRequestPermissionsResult 中的requestCode
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        }
    }

    
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 1) {
            //XXXXXXXXXXX
        }
    }

然后在需要使用的地方调用即可。

5.读取文件中的信息 ,我们通过文件输入流读取 :

**

 String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/imooc.txt";
        Log.e(TAG, "onCreate: " + path);
        File file = new File(path);
try {
           
            FileInputStream inputStream = new FileInputStream(file);
            byte[] bytes = new byte[1024];
            int read = inputStream.read(bytes);
            String string = new String(bytes, 0, read);
            inputStream.close();
            Log.e(TAG, "onCreate:1111 " + string);
        } catch (IOException e) {
            e.printStackTrace();
        }

二、内部存储

内部存储和外部存储大致相同,就省略一些了:

image.png

**

         //获取内部File路径 ,表示获取"getFileDir.txt" 路径, 内容存放在如上图 
        File file = new File(getFilesDir(), "getFileDir.txt");

        try {
            if (!file.exists()) {
                file.createNewFile();
            }
            Log.e(TAG, "onCreate: " + "rennene");
            FileOutputStream fileOutputStream = new FileOutputStream(file, true);
            String aaa = "哈哈哈哈哈哈哈";
            fileOutputStream.write(aaa.getBytes());
            fileOutputStream.close();
            FileInputStream inputStream = new FileInputStream(file);
            byte[] bytes = new byte[1024];
            int read = inputStream.read(bytes);
            inputStream.close();
            String string = new String(bytes, 0, read);
            Log.e(TAG, "onCreate:1111 " + string);
        } catch (IOException e) {
            e.printStackTrace();
        }