I/O流的概述分析
IO流-字节流
- IO的基本概念
什么是IO流?(从实际应用案例来感性认识IO流的重要性,阅卷功能,上传,下载等等)(Input、Output)
IO流如何划分?
按方向分:输入流、输出流
按单位分:字节流、字符流(读取数据的单位)
读文本文件:字符流
文本文件,图片,视频(二进制文件):字节流
按功能分:节点流、处理流
你可以认为处理流功能更强大
- 数据单位换算
计算机保存文件的最小单位是字节
1K=1024字节
1M=1024K
1G=1024M
1T=1024G
1P=1024T - 字节流(输入、输出)
字节流是最早出现的流,因为计算机保存文件的最小单位就是字节
成对出现的
API为我们提供了两个字节流的基类
public abstract class InputStream
extends Object
implements Closeable
此抽象类是表示字节输入流的所有类的超类。
public abstract class OutputStream
extends Object
implements Closeable, Flushable
此抽象类是表示输出字节流的所有类的超类。
重点问题:什么是输入流,什么是输出流,如何区分?
4. 应用驱动API学习-字节流
4.1. 写内容到文件中
-
对异常直接抛出,不处理的方式
-
采用标准处理异常的方式
-
实现对文件内容的追加
-
如果文件不存在,会出现什么情况?
4.2. 读取文件的内容 -
采用逐个字节的读取方式
-
如果文件不存在,会出现什么情况
4.3. 完成文件的拷贝功能 -
完成普通文本文件的拷贝
-
完成二进制文件的拷贝
a) 图片b) 视频
4.4. 优化文件的读写性能 -
读写大文件,例如视频文件,还是采用一个一个字节复制,效率极低,所以API为我们提供了数组的读取功能,具备缓冲区的作用,提高效率
-
采用字节缓冲区流–处理流
public class FilterInputStream
extends InputStream
FilterInputStream 包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。FilterInputStream 类本身只是简单地重写那些将所有请求传递给所包含输入流的 InputStream 的所有方法。FilterInputStream 的子类可进一步重写这些方法中的一些方法,并且还可以提供一些额外的方法和字段。
设计模式:装饰者模式
public class BufferedInputStream
extends FilterInputStream
BufferedInputStream 为另一个输入流添加一些功能,在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。
public class FilterOutputStream
extends OutputStream
此类是过滤输出流的所有类的超类。这些流位于已存在的输出流(基础 输出流)之上,它们将已存在的输出流作为其基本数据接收器,但可能直接传输数据或提供一些额外的功能。
public class BufferedOutputStream
extends FilterOutputStream
该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。
IO流-字符流
- 应用驱动API学习-字符流一
public abstract class Reader
extends Object
implements Readable, Closeable
用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
public abstract class Writer
extends Object
implements Appendable, Closeable, Flushable
写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
public class InputStreamReader
extends Reader
转换流
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
public class OutputStreamWriter
extends Writer
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
1.1. 采用OutputStreamWriter写内容到文件中
-
实现写入功能
-
实现对文件内容的追加
1.2. 采用InputStreamReader读取文件的内容 -
一个字符数组的读取
-
如果文件不存在,会出现什么情况
- 为了简化上述代码的编写,API给上述的两种转换流都提供了相关的子类
public class FileWriter
extends OutputStreamWriter
用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。
public class FileReader
extends InputStreamReader
用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。
2.1. 请大家先参照API完成以下功能
- 前提:采用FileReader和FileWriter
- 实现对文件的读功能
- 实现对文件的写功能
- 自带缓冲区的流
public class BufferedReader
extends Reader
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
public class BufferedWriter
extends Writer
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。
3.1. 请大家先参照API完成以下功能
- 前提:采用BufferedReader和BufferedWriter
- 实现对文件的读功能
- 实现对文件的写功能