一.前言

    文件储存是一种最基本的数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动的保存到文件当中的,因而比较适合存储一些简单的文本数据或二进制;如果想要保存一些较为复杂的文本数据,就需要定义一套自己的格式规范,方便之后将数据从文件中解析出来。

    在了解文件存储之前,先了解IO流的概念。

    IO流即输入输出流,流是一组有顺序的,有起点和终点的字节结合,是对数据传输的总称。即数据在两设备间的传输称为流,流的本质是数据传输。

    IO流可以分为字节流和字符流,给出相应的IO 结构图[1]。

    java/Android 中的文件储存

    总结写在前面,很重要,很关键:

    不论是对文件进行读取或是写入操作,和文件进行操作的 IO 流都是字节流,即往文件里面写的流的形式是字节流,读取文件内容得到的流的形式也是字节流。

二. 将数据写入文件(openFileOutput)

2.1 写操作相关的类和方法

1. Context 类中的openFileOutput() 函数

2. OutputStreamWriter 类

3. BufferedWriter 类

2.2 用法与释义

1. FileOutputStream out = openFileOutput("data",Context.MODE_PRIVATE)

    用于将文件存储到指定的文件中,第一个参数是文件名,不可以包含路径,会自动依据文件名创建文件data.txt,因为所有的文件都是默认存储到/data/data/<package_name>/files/ 目录下的。第二个参数是文件的操作模式,可选MODE_PRIVATE和MODE_APPEND.

    该方法返回FileOutputStream,称作文件输出流,用于对文件的写入操作,也称字节流。

2.  new OutputStreamWriter(out)

    OutputStreamWriter 是字符流 ==》字节流的桥梁,使用指定的编码方式,将写入流中的字符编码成为字节流。

3.BufferedWriter write = new BufferedWrite (new OutputStreamWriter(out))

    创建字符流缓冲区,将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。

写入文件的代码实现,参看下面的实现:

字符输出流 ==》转化流 ==》 字节流 ==》 文件

java/Android 中的文件储存

此处需要注意,在关闭缓冲流之前,需要通过flush()方法刷新该流的缓冲,防止缓冲区中还有存在部分数据没有写入底层输出流。

三. 从文件读取数据(openFileInput)

3.1 读操作涉及的相关类和方法

1. Context 类中的 openFileInput("data")方法

2. InputStreamReader 类

3. BufferedReader 类

4. StringBuilder 类

3.2 用法与释义

1.FileInputStream in = openFileInput("data") ;

    类似于将数据存储到文件中,Context类中还提供了一个openFileInput()的方法, 用于从文件中读取数据。只接受一个参数,即要读取的文件名,同样也不能写路径,因为系统会自动到/data/data/<package_name> 中去加载文件。

2. new InputStreamReader(in)

    InputStreamReader() 与OutputStreamWriter()相反,是 字节流 =》字符流  的 桥梁。

3. BufferedReader  reader = new BufferedReader(new InputStreamReader (in));

    line = reader.readLine();

        创建字符流缓冲区,每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层(指内存中的文件)输入流读取一个或多个字节。

4. StringBuilder content = new StringBuilder();

    content.append(line);

    Java中虽然可以通过+直接拼接字符串,但是,在循环中都会创建新的字符串对象,然后扔掉旧的字符串。这样,绝大部分字符都是临时对象,不但浪费内存,还会影响GC效率。

为了可以高效拼接字符串,Java 标准库踢动了StringBuilder类,可以预分配缓冲区,往StringBuilder 中新增字符串是,不会创建新的临时对象。

5.读取文件数据的实现,见如下:

文件 ==》 字节流 ==》转换流 ==》字符流

java/Android 中的文件储存

五.参考资料

1. https://www.iteye.com/blog/longpo-2201767

2. https://blog.csdn.net/ai_bao_zi/article/details/81168420

3. https://blog.csdn.net/lipinganq/article/details/53427102

4. https://blog.csdn.net/qq_27093465/article/details/53308032

5. https://blog.csdn.net/weijinqian0/article/details/75351560

6. java 中StringBuilder https://www.liaoxuefeng.com/wiki/1252599548343744/1260471862687712

相关文章:

  • 2021-10-31
  • 2021-11-13
  • 2022-12-23
  • 2022-12-23
  • 2021-11-22
  • 2021-11-27
  • 2021-06-11
  • 2021-12-21
猜你喜欢
  • 2022-12-23
  • 2021-06-15
  • 2021-04-16
  • 2022-12-23
  • 2021-07-15
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案