Java 二进制I/O


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 层
I/O 层次

1
2
3
4
5
6
1. File(文件特征与管理):用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等
2. InputStream(字节流,二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的父类。定义了所有输入流都具有的共同特征
3. OutputStream(字节流,二进制格式操作):抽象类。基于字节的输出操作。是所有输出流的父类。定义了所有输出流都具有的共同特征
4. Reader(字符流,文本格式操作):抽象类,基于字符的输入操作
5. Writer(字符流,文本格式操作):抽象类,基于字符的输出操作
6. RandomAccessFile(随机文件操作):它的功能丰富,可以从文件的任意位置进行存取(输入输出)操作

I/O 流

java.io 包里有 4 个基本类:InputStream、OutputStream 及 Reader、Writer 类,它们分别处理字节流和字符流,其他流都是由这 4 个派生出来的:
I/O 流

InputStream 类和 OutputStream 类

InputStream 为字节输入流,它本身为一个抽象类,必须依靠其子类实现各种功能,此抽象类是表示字节输入流的所有类的超类。继承自 InputStream 的流都是向程序中输入数据的,且数据单位为字节(8bit)
OutputStream 和 InputStream 是相对应的

FileInputStream 和 FileOutputStream

一个流被定义为一个数据序列,输入流用于从源读取数据,输出流用于向目标写数据

FileInputStream

FileInputStream 用于从文件读取数据,它的对象可以用关键字 new 来创建
有多种构造方法可用来创建对象:

  1. 可以使用字符串类型的文件名来创建一个输入流对象来读取文件

    1
    InputStream f = new FileInputStream("C:/kt");
  2. 也可以使用一个文件对象来创建一个输入流对象来读取文件

    1
    2
    File f = new File("C:/kt");
    InputStream out = new FileInputStream(f);
FileOutputStream

该类用来创建一个文件并向文件中写数据
如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件
有两个构造方法可以用来创建 FileOutputStream 对象

  1. 使用字符串类型的文件名来创建一个输出流对象

    1
    OutputStream f = new FileOutputStream("C:/kt");
  2. 也可以使用一个文件对象来创建一个输出流来写文件

    1
    2
    File f = new File("C:/kt");
    OutputStream f = new FileOutputStream(f);

 Comments