Android数据存储之文件存储

Android中实现数据存储的三种方式:

1、文件存储
2、SharedPreference存储
3、SQLite数据库存储

下面给出三种方式的数据文件默认存储的位置:

数据存储方式

下面给出存储的位置以及导出的方式

存储位置以及导出.png

文件存储

文件存储是Android中最基本的一种存储方式,和Java中实现I/O的方式,由Context类提供openFileInput()和openFileOutput()方法打开。文件存储主要分两种存储,一种是内部存储,一种是外部存储。

  • 内部存储

使用了FileInputStream类中的openFileInput()方法,用于读取数据;使用了FileOutputStream类中的openFileOutput()方法,用于写入数据。

  • 外部存储

使用Enviroment类中的getExternalStorageDirectory()方法对外部存储上的文件进行读写。
注意:写入时需要添加写入权限

内部存储

  • 存储数据

1、通过openFileOutput(String name, int mode)来返回一个
FileOutputStream对象
2、通过调用fileOutputStream.write(content.getBytes());来进行写入
write(byte b[])可以看出这里存储的不是String,而是通过字节的形式进行存储的
3、调用fileOutputStream.flush();因为write()方法是写入缓冲区的,调用flush()方法将缓冲中的数据写入到文件,清空缓存
4、最后调用close来将流关闭:fileOutputStream.close();

//存储数据
    private void Save(String content) {
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = openFileOutput(mFileName, MODE_PRIVATE);
            fileOutputStream.write(content.getBytes());
            fileOutputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileOutputStream != null) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
  • 读取数据

1、通过openFileInput(String name)来返回一个FileInputStream对象
2、byte[] buff = new byte[1024];这里是每1024个字节进行读取一次
3、StringBuffer sb = new StringBuffer();创建StringBuffer来进行字符串的拼接
4、最后调用close来将流关闭:fileInputStream.close();

//读取数据
    private String read() {
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = openFileInput(mFileName);
            byte[] buff = new byte[1024];
            StringBuffer sb = new StringBuffer();
            int len = 0;
            while ((len = fileInputStream.read(buff)) > 0) {
                sb.append(new String(buff, 0, len));
            }
            return sb.toString();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
内部存储.gif

存储的文件.png

外部存储

  • 前言

其实外部存储方式和内部存储区别不是很大 只是存储的位置发生了变化,内部存储用户是看不到存储的数据,而外部存储是存储到手机外置内存中 是可以查看到存储的数据

  • 存储数据

前提需要进行写入权限的申请

//外部存储数据
    private void fileSave(String content) {
        FileOutputStream fileOutputStream = null;
        try {
            //第一步先创建文件夹
            File dir = new File(Environment.getExternalStorageDirectory(), "dongbo");
            if (!dir.exists()) {
                //判断文件夹是否存在 若不存在,则创建文件夹
                dir.mkdirs();
            }
            //第二部创建文件
            File file = new File(dir, mFileName);
            if (!file.exists()) {
                //判断文件是否存在 若不存在,则创建文件
                file.createNewFile();
            }
            fileOutputStream = new FileOutputStream(file);
            fileOutputStream.write(content.getBytes());
            fileOutputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileOutputStream != null) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
  • 读取数据
//读取外部数据
    private String fileRead() {
        FileInputStream fileInputStream = null;
        try {
//            fileInputStream = openFileInput(mFileName);
            File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "dongbo", mFileName);
            fileInputStream = new FileInputStream(file);
            byte[] buff = new byte[1024];
            StringBuffer sb = new StringBuffer();
            int len = 0;
            while ((len = fileInputStream.read(buff)) > 0) {
                sb.append(new String(buff, 0, len));
            }
            return sb.toString();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

总结文件存储

  • 存储路径

1、mContext.getFilesDir().getAbsolutePath() 内部存储的File路径
2、mContext.getCacheDir().getAbsolutePath() 内部存储的缓存路径
3、mContext.getDir("project", MODE_PRIVATE) 创建新的文件路径
4、Environment.getExternalStorageDirectory().getAbsolutePath() 外部存储的路径
5、mContext.deleteFile(mFileName);//删除指定文件

存储路径.png
  • mode操作模式 分两种:

MODE_APPEND(文件创建模式,在openFileOuput方法中使用,如果文件存在,那么会在已存在的文件后面接着写入数据,而不是删除已存在的数据。)大家可以看到这里的数据不是将之前的数据删除之后重新创建,而是直接进行添加

MODE_PRIVATE(文件创建模式,默认的模式,用这个模式创建的文件只能被当前调用的应用程序访问。(或者所有拥有相同UID的应用,这个UID其实就是每个进程的UID,也就是说同一进程访问,这里涉及到多进程的知识,在此不详细展开了))

说明:
自Api17以来,常量MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE已经被弃用。
从Android N开始,使用这些常量会引发securityException。
这意味着,面向Android N 和更高版本的应用无法按名称共享私有文件,尝试共享file://URL将会导致引发FileUriExposedException。
如果应用需要与其他应用共享私有文件,则可以将FileProvider与FLAG_GRANT_READ_URI_PERMISSION配合使用。

  • 涉及用户

当用户卸载应用之后,内部存储的文件也会随之卸载而删除,而外部存储则不会删除

  • 存储的范围

存储的数据可以是文本、照片、pdf文件,但是需要注意的是都需要把数据转换成字节的形式来进行写入,读取的时候也是根据字节的形式来读取,将数据转换成指定类型的数据

若有不足,请大家指教

数据存储相关文章
Android数据存储之文件存储
Android数据存储之SharedPreferences
Android数据存储之SQLite存储

你可能感兴趣的:(Android数据存储之文件存储)