教材学习内容总结
IO流学习总结
1、流的概念和作用
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
2、IO流的分类
根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入流和输出流。
字符流和字节流
字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。字节流和字符流的区别:
- 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节;
- 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据;
- 字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件,我们将在下面验证这一点。
结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。
输入流和输出流
对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。
3、IO流类图结构
4、IO流练习案例
(1)复制文件的五种方式
分析
复制数据时,若使用记事本打开可以读懂,使用字符流,否则使用字节流;即复制文本文件,采用字符流的方式实现,总共有5中方法可以实现。
1. 使用字符转换流(一次读取一个字节);
2. 使用字符转换流(一次读取一个字节数组);
3. 使用文件字符流(一次读取一个字节);
4. 使用文件字符流(一次读取一个字节数组);
5. 使用高效字符流(一次读取一个数据行)。
代码实例
(2)复制图片(二进制流数据) 四种方式
1. 使用文件字节流实现(一次读取一个字节);
2. 使用文件字节流实现(一次读取一个字节数组);
3. 使用高效字节流实现(一次读取一个字节);
4. 使用高效字节流实现(一次读取一个字节数组)。
说明
复制图片、视频、音频、压缩文件、exe可执行文件等。
分析
复制数据时,若使用记事本打开可以读懂,使用字符流,否则使用字节流;即复制图片、视频、音频、压缩文件、exe可执行文件等时,采用字节流的方式,总共有4种方法可以实现。
代码实例
(3)把集合中的数据存储到文本文件
说明
将集合中的字符串数据存储到文本文件,并从文本文件中读取数据(每一行为一个字符串数据)到集合中,遍历输出到控制台。
分析
字符串存取,为文本操作,文件操作使用字符流。
代码实例
(4)把文本文件中的数据读取到集合并遍历集合
说明
把文本文件中的数据读取到集合,遍历并输出到控制台。
代码实例
(5)键盘录入学生信息,按照总分排序,并写入文本文件
(6)把一个文件中的字符串排序后再写入另一个文件
- 把一个文件中的字符串排序后再写入另一个文件(对多个字符串进行排序);
- 把一个文件中的字符串排序后再写入另一个文件(对一个字符串进行字符排序)。
分析
1. 获取源文件File对象;
2. 获取目标文件File对象;
3. 创建集合对象,设置排序规则(TreeSet<String>);
4. 将源文件中的字符串内容读取到集合中;
5. 将集合中的内容保存到目标文件;
6. 释放资源。
代码实例
5、扩展:其他IO流
1. 内存操作流;
2. 打印流;
3. 标准输入输出流;
4. 随机访问流;
5. 合并流;
6. 序列化流;
7. Properties集合;
8. NIO包下的IO流。
(1)内存操作流
说明
内存操作流——用于处理临时存储的数据,程序结束,数据就从内存中消失。
常用API
- 字节数组操作流:ByteArrayOutputStream、ByteArrayInputStream;
- 字符数组操作流:CharArrayReader、CharArrayWriter;
- 字符串操作流:StringReader、StringWriter。
代码实例
(2)打印流
说明
- 字节打印流:PrintStream;
- 字符打印流:PrintWriter。
打印流的四个特点
1. 只能写数据,不能读数据;即只能操作目的地,不能操作数据源;
2. 可以写任意数据类型的数据;
3. 如果启动了自动刷新,在调用 println、printf 或 format 方法将会刷新输出缓冲区;
4. 可以直接操作文本文件。
代码实例
(3)标准流
分类
- “标准”输入流;
```
public static final InputStream in 此流已打开并准备提供输入数据。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。
public static void setIn(InputStream in) 重新分配“标准”输入流。
InputStream in = System.in -> 获取从键盘中输入的数据,并将获取到的数据读入字节输入流对象InputStream中。
```
- “标准”输出流;
```
public static final PrintStream out 此流已打开并准备接受输出数据。通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。
public static void setOut(PrintStream out) 重新分配“标准”输出流。
PrintStream out = System.out
out.println(输出数据),调用PrintStream字节打印流的println()方法向控制台或显示器输出数据。
```
- “标准”错误输出流;
```
public static final PrintStream err 按照惯例,此输出流用于显示错误消息。 通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。
public static void setErr(PrintStream err) 重新分配“标准”错误输出流。
PrintStream err = System.err
err.println(输出错误数据),即调用PrintStream字节打印流的println()方法向控制台或显示器打印错误提示信息。
```
代码实例
(4)随机访问流
说明
- 使用随机访问文件类向指定文件中写数据;
- 使用随机访问文件类从指定文件中读取数据。
代码实例
(5)合并流
说明
SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。
继承关系
|-InputStream
|-SequenceInputStream
代码实例
(6)序列化流
说明
对象序列化流:
序列化流——ObjectOutputStream
把对象按照流方式存入到文本文件或者在网路中传输:对象->流数据。
反序列化流——ObjectInputStream
把文本文件中的流对象或者网路中的流对象数据还原成对象:流数据->对象。
说明:类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。
序列化接口没有方法或字段,仅用于标识可序列化的语义,代表一种功能。
代码实例
(7)Properties集合
说明
Properties:属性集合类,是一个可以与IO流相结合的集合类。可保存到流中,或从流中加载。
继承关系
|-HashTable
|-Properties:是一个Map集合,属性列表中每个键及其对应值都是一个字符串。
代码实例
(8)NIO包下的IO流
百度百科,待补充。
代码托管
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 220/220 | 1/1 | 10/10 | |
第二周 | 400/620 | 1/2 | 18/28 | |
第三周 | 650/1120 | 1/3 | 12/40 | |
第四周 | 1443/2563 | 1/4 | 12/52 | |
第五周 | 3214/5777 | 1/5 | 20/72 |
参考资料
-
[Effective.Java中文版(第2版)].布洛克;
-
[Head First Java (中文版)].塞若;
-
Java从入门到精通 第三版;
-
深入Java内存模型;
-
[Java语言程序设计-进阶篇(原书第8版)].梁勇
-
Head First设计模式(高清版);