【从零到一】Android数据存储(一) | (资源存储、内部存储、外部存储)

安卓数据处理

  • 瞬时数据:存储到内存当中,回因为程序关闭或其他原因导致内存被回收而丢失。
  • 持久化数据:存储到介质中,即时在关机情况下,数据仍不会丢失。用于存储图片缓存,用户信息等。

持久化存储的种类

  • 资源存储
  • 文件存储(内部存储、外部存储)
文件存储 空间容量 存储位置 访问权限 应用场景
内部存储 /data/data/<package_name>/files APP内部 存储用户账号密码等
外部存储 外部所有目录 均可以访问 存储图片、视频等
  • SharedPreferences存储
  • 数据库存储
  • Content Provider存储

注意:粗体为本篇文章将讲述内容,其余的会在接下来的文章中补充。


File数据存储

资源存储(Assets中的数据处理)

  • Android Studio中assets目录位置:app/sec/main/assets
    在这里插入图片描述
  • assets中文件不会被编译
  • 占用APK体积

1.通过AssetManager读取数据:context.getAsset().open(fileName)

    /**
     * 读取Assets中的文件
     */
    @Nullable
    private String readAssetsContent(String fileName) {
        InputStream fis = null;
        BufferedReader reader = null;
        try {
            fis = this.getAssets().open(fileName);//this.getAssets()方法读取AssetsManager
            reader = new BufferedReader(new InputStreamReader(fis));
            StringBuilder builder = new StringBuilder();
            String line;
            while ((line = reader.readLine()) !=null){
                builder.append(line);
            }
            return builder.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭操作
            try {
                if (fis!=null){
                    fis.close();
                }
                if (reader !=null){
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        return null;
    }

在这里插入图片描述
2. 通过文件路径读取数据:file:///android_asset/fileName

        mWebView = findViewById(R.id.webview);
        mWebView.loadUrl("file:///android_asset/macardo.txt");

在这里插入图片描述


内部存储

  1. 内部存储!=内存(是外存上的一片空间,指存储在APP包内的一片空间)
  2. 特点:只能被自己应用访问,控件有限
  3. 存储位置:/data/data/<package_name>/files
  4. 操作模式:MODE_PRIVATE&MODE_APPEND
    MODE_PRIVATE:新内容覆盖旧内容
    MODE_APPEND:新内容追加到旧内容后面
    private boolean savetoInternalFile(String fileName, String content,boolean isAppend) {
        if (fileName == null||fileName.length() ==0 || content == null || content.length() ==0){
            return false;
        }

        FileOutputStream fos = null;
        try {
            if (isAppend) {
                fos = openFileOutput(fileName, MODE_APPEND);
            }else {
                fos = openFileOutput(fileName, MODE_PRIVATE);
            }
            fos.write(content.getBytes());
            return true;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (fos!=null){
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return false;
    }
    private String readFromInternalFile(String fileName) {
        FileInputStream fis = null;
        BufferedReader reader = null;
        try {
            fis = openFileInput(fileName);
            reader =new BufferedReader(new InputStreamReader(fis));
            StringBuilder builder = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null){
                builder.append(line);
            }
            return builder.toString();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (fis != null){
                    fis.close();
                }
                if (reader != null){
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

在这里插入图片描述


外部存储

  • 特点:即可公有又可私有,空间相对充足
  • 存储位置
    公有:Environment.getExternalStorageDirectory()
    私有:/Android/data/<package_name>/files
  • 权限申请
	//读取外部文件权限
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    //写入外部文件权限
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

注意:targetSdkVersion >= 23 需要进行权限的动态申请,因为Android6.0之后加强了权限的管理机制,在Android6.0以上的设备需要进行动态申请。

    //动态检查文件权限
    private void checkFilePermission() {
        //PERMISSION_GRANTED为获取到的权限
        if (ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED){
            //未获取到文件的权限
            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQ_CODE_FILE);//REQ_CODE_FILE = 1
        }
    }
 private boolean checkExternalState(){
        //MEDIA_MOUNTED:SD卡正常挂载,并且挂载点可读/写
        //Environment.getExternalStorageState:获取外部存储的状态
        return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == REQ_CODE_FILE && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
            Toast.makeText(this,"成功获取文件权限",Toast.LENGTH_SHORT).show();
        }else {
            Toast.makeText(this,"未获取文件权限",Toast.LENGTH_SHORT).show();
        }
    }

在这里插入图片描述

Github项目地址: Macardo/Data-Handling.

猜你喜欢

转载自blog.csdn.net/weixin_43482267/article/details/88808850