Java常用API_IO流
第十七章 IO流
17.1 IO流的概念
- IO就是Input和Output的简写,也就是输入和输出的含义。
- IO流就是指读写数据时像流水一样从一端流到另外一端,因此得名为“流"。
17.2 基本分类
- 按照读写数据的基本单位不同,分为 字节流 和 字符流。
- 其中字节流主要指以字节为单位进行数据读写的流,可以读写任意类型的文件。
- 其中字符流主要指以字符(2个字节)为单位进行数据读写的流,只能读写文本文件。
- 按照读写数据的方向不同,分为 输入流 和 输出流(站在程序的角度)。
- 其中输入流主要指从文件中读取数据内容输入到程序中,也就是读文件。
- 其中输出流主要指将程序中的数据内容输出到文件中,也就是写文件。
- 按照流的角色不同分为节点流和处理流。
- 其中节点流主要指直接和输入输出源对接的流。
- 其中处理流主要指需要建立在节点流的基础之上的流。
17.3 体系结构
17.4 相关流的详解
17.4.1 FileWriter类(重点)
(1)基本概念
- java.io.FileWriter类主要用于将文本内容写入到文本文件。
(2)常用的方法
17.4.2 FileReader类(重点)
(1)基本概念
- java.io.FileReader类主要用于从文本文件读取文本数据内容。
(2)常用的方法
17.4.3 FileOutputStream类(重点)
(1)基本概念
- java.io.FileOutputStream类主要用于将图像数据之类的原始字节流写入到输出流中。
(2)常用的方法
17.4.4 FileInputStream类(重点)
(1)基本概念
- java.io.FileInputStream类主要用于从输入流中以字节流的方式读取图像数据等。
(2)常用的方法
- 案例题目
- 编程实现两个文件之间的拷贝功能。
17.4.5 BufferedOutputStream类(重点)
(1)基本概念
- java.io.BufferedOutputStream类主要用于描述缓冲输出流,此时不用为写入的每个字节调用底层系统。
(2)常用的方法
17.4.6 BufferedInputStream类(重点)
(1)基本概念
- java.io.BufferedInputStream类主要用于描述缓冲输入流。
(2)常用的方法
17.4.7 BufferedWriter类(重点)
(1)基本概念
- java.io.BufferedWriter类主要用于写入单个字符、字符数组以及字符串到输出流中。
(2)常用的方法
17.4.8 BufferedReader类(重点)
(1)基本概念
- java.io.BufferedReader类用于从输入流中读取单个字符、字符数组以及字符串。
(2)常用的方法
17.4.9 PrintStream类
(1)基本概念
- java.io.PrintStream类主要用于更加方便地打印各种数据内容。
(2)常用的方法
17.4.10 PrintWriter类
(1)基本概念
- java.io.PrintWriter类主要用于将对象的格式化形式打印到文本输出流。
(2)常用的方法
- 案例题目
- 不断地提示用户输入要发送的内容,若发送的内容是"bye"则聊天结束,否则将用户输入的内容写入到文件d:/a.txt中。
- 要求使用BufferedReader类来读取键盘的输入 System.in代表键盘输入
- 要求使用PrintStream类负责将数据写入文件
17.4.11 OutputStreamWriter类
(1)基本概念
- java.io.OutputStreamWriter类主要用于实现从字符流到字节流的转换。
(2)常用的方法
17.4.12 InputStreamReader类
(1)基本概念
- java.io.InputStreamReader类主要用于实现从字节流到字符流的转换。
(2)常用的方法
17.4.13 字符编码
(1)编码表的由来
- 计算机只能识别二进制数据,早期就是电信号。为了方便计算机可以识别各个国家的文字,就需要将各个国家的文字采用数字编号的方式进行描述并建立对应的关系表,该表就叫做编码表。
(2)常见的编码表
- ASCII:美国标准信息交换码, 使用一个字节的低7位二位进制进行表示。
- ISO8859-1:拉丁码表,欧洲码表,使用一个字节的8位二进制进行表示。
- GB2312:中国的中文编码表,最多使用两个字节16位二进制为进行表示。
- GBK:中国的中文编码表升级,融合了更多的中文文字符号,最多使用两个字节16位二进制位表示。
- Unicode:国际标准码,融合了目前人类使用的所有字符,为每个字符分配唯一的字符码。所有的文字都用两个字节16位二进制位来表示。
(3)编码的发展
- 面向传输的众多 UTF(UCS Transfer Format)标准出现了,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。这是为传输而设计的编码并使编码无国界,这样就可以显示全世界上所有文化的字符了。
- Unicode只是定义了一个庞大的、全球通用的字符集,并为每个字符规定了唯一确定的编号,具体存储成什么样的字节流,取决于字符编码方案。推荐的Unicode编码是UTF-8和UTF-16。
- UTF-8:变长的编码方式,可用1-4个字节来表示一个字符。
17.4.14 DataOutputStream类(了解)
(1)基本概念
- java.io.DataOutputStream类主要用于以适当的方式将基本数据类型写入输出流中。
(2)常用的方法
17.4.15 DataInputStream类(了解)
(1)基本概念
- java.io.DataInputStream类主要用于从输入流中读取基本数据类型的数据。
(2)常用的方法
17.4.16 ObjectOutputStream类(重点)
(1)基本概念
- java.io.ObjectOutputStream类主要用于将一个对象的所有内容整体写入到输出流中。
- 只能将支持 java.io.Serializable 接口的对象写入流中。
- 类通过实现 java.io.Serializable 接口以启用其序列化功能。
- 所谓序列化主要指将一个对象需要存储的相关信息有效组织成字节序列的转化过程。
(2)常用的方法
17.4.17 ObjectInputStream类(重点)
(1)基本概念
- java.io.ObjectInputStream类主要用于从输入流中一次性将对象整体读取出来。
- 所谓反序列化主要指将有效组织的字节序列恢复为一个对象及相关信息的转化过程。
(2)常用的方法
(3)序列化版本号
- 序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常(InvalidCastException)。
(4)transient关键字
- transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。
(5)经验的分享
- 当希望将多个对象写入文件时,通常建议将多个对象放入一个集合中,然后将集合这个整体看做一个对象写入输出流中,此时只需要调用一次readObject方法就可以将整个集合的数据读取出来,从而避免了通过返回值进行是否达到文件末尾的判断。
17.4.18 RandomAccessFile类
(1)基本概念
- java.io.RandomAccessFile类主要支持对随机访问文件的读写操作。
(2)常用的方法