一.前言
文件储存是一种最基本的数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动的保存到文件当中的,因而比较适合存储一些简单的文本数据或二进制;如果想要保存一些较为复杂的文本数据,就需要定义一套自己的格式规范,方便之后将数据从文件中解析出来。
在了解文件存储之前,先了解IO流的概念。
IO流即输入输出流,流是一组有顺序的,有起点和终点的字节结合,是对数据传输的总称。即数据在两设备间的传输称为流,流的本质是数据传输。
IO流可以分为字节流和字符流,给出相应的IO 结构图[1]。
总结写在前面,很重要,很关键:
不论是对文件进行读取或是写入操作,和文件进行操作的 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))
创建字符流缓冲区,将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。
写入文件的代码实现,参看下面的实现:
字符输出流 ==》转化流 ==》 字节流 ==》 文件
此处需要注意,在关闭缓冲流之前,需要通过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.读取文件数据的实现,见如下:
文件 ==》 字节流 ==》转换流 ==》字符流
五.参考资料
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