Java 文本与二进制 I/O 总结(Java 流 Stream、文件 File 和 IO)
文本 I/O 与二进制 I/O
二进制 I/O 不涉及编码和解码,因此更高效
文本 I/O 建立在二进制 I/O 的基础之上,它提供一层抽象,用于字符层次自动进行的编码和解码
Java 的类文件存储为二进制文件。因为二进制文件与主机编码方案无关,可移植,在任何机器上的 Java 程序可以读取 Java 程序创建的二进制文件。
流
流 (stream) 的概念源于 UNIX 中管道 (pipe) 的概念。在 UNIX 中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等
形象的比喻:水流 文件 ——– 程序,文件和程序之间连接一个管道,水流就在之间形成了,自然就有方向,可以流进,也可以流出,即 流 就是一个管道里面有流水,这个管道连接了文件和程序
数据流分类
流序列中的数据既可以是未经加工的原始二进制数据,也可以是经一定编码处理后符合某种格式规定的特定数据。因此Java中的流分为两种:
- 字节流:数据流中最小的数据单元是字节
- 字符流:数据流中最小的数据单元是字符, Java 中的字符是 Unicode 编码,一个字符占用两个字节
1
2
3字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer
Java 的字符流,采用的是 Unicode 标准,16 位,两个字节
reader 是所有读取字符串输入流的祖先,而 writer 是所有输出字符串输出流的根类。
I/O 概览
Java.io 包中最重要的就是 5 个类和 1 个接口:
- 类:File OutputStream InputStream Writer Reader
- 接口:Serializable
I/O 层次
分为 3 层1
2
3
4
5
61. File(文件特征与管理):用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等
2. InputStream(字节流,二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的父类。定义了所有输入流都具有的共同特征
3. OutputStream(字节流,二进制格式操作):抽象类。基于字节的输出操作。是所有输出流的父类。定义了所有输出流都具有的共同特征
4. Reader(字符流,文本格式操作):抽象类,基于字符的输入操作
5. Writer(字符流,文本格式操作):抽象类,基于字符的输出操作
6. RandomAccessFile(随机文件操作):它的功能丰富,可以从文件的任意位置进行存取(输入输出)操作
I/O 流
java.io 包里有 4 个基本类:InputStream、OutputStream 及 Reader、Writer 类,它们分别处理字节流和字符流,其他流都是由这 4 个派生出来的:
InputStream 类和 OutputStream 类
InputStream 为字节输入流,它本身为一个抽象类,必须依靠其子类实现各种功能,此抽象类是表示字节输入流的所有类的超类。继承自 InputStream 的流都是向程序中输入数据的,且数据单位为字节(8bit)
OutputStream 和 InputStream 是相对应的
FileInputStream 和 FileOutputStream
一个流被定义为一个数据序列,输入流用于从源读取数据,输出流用于向目标写数据
FileInputStream
FileInputStream 用于从文件读取数据,它的对象可以用关键字 new 来创建
有多种构造方法可用来创建对象:
可以使用字符串类型的文件名来创建一个输入流对象来读取文件
1
InputStream f = new FileInputStream("C:/kt");
也可以使用一个文件对象来创建一个输入流对象来读取文件
1
2File f = new File("C:/kt");
InputStream out = new FileInputStream(f);
FileOutputStream
该类用来创建一个文件并向文件中写数据
如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件
有两个构造方法可以用来创建 FileOutputStream 对象
使用字符串类型的文件名来创建一个输出流对象
1
OutputStream f = new FileOutputStream("C:/kt");
也可以使用一个文件对象来创建一个输出流来写文件
1
2File f = new File("C:/kt");
OutputStream f = new FileOutputStream(f);