Java I/O流详解

时间:2023-02-17 16:59:56

一.  流的概念和作用

流是一种有顺序的,有起点和终点的字节集合,是对数据传输的总成或抽象。即数据在两设备之间的传输称之为流,流的本质是数据传输,根据数据传输的特性讲流抽象为各种类,方便更直观的进行数据操作。

二.  IO流的分类

根据数据处理类的不同分为:字符流和字节流。

根据数据流向不同分为:输出流和输入流。

根据功能分类:节点流和过滤流。

三.  字符流和字节流

字符流的由来:因为数据编码的不同,而有了对字符进行高效操作的流对象,其本质就是基于字节流读取时,去查指定的码表。

字符流与字节流的区别:

(1)    读写单位不同:字节流一字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可读多个字节。

(2)    处理对象不同:字节流能够处理所有类型的数据(例如:图片),而字符流只能处理字符类型的数据。

(3)    字节流操作的时候本身是不会用到缓冲区的,是对文件本身的直接操作。而字符流在操作的时候是会用到缓冲区的,通过缓冲区来操作文件。

结论:优先使用字节流,首先在硬盘上所有的文件都是以字节的形式进行传输或保存的,包括图片等内容。但字符流只是在内存中才会形成,所以在开发中字节流使用广泛。

四. 输入流和输出流

对输入流只能进行读操作,对输出流只能进行写操作。程序中根据数据的传输的不同特性使用不同的流。

五. 输入字节流InputStream

InputStream是所有输入字节流的父类,它是一个抽象类。

ByteArrayInputStream、StringBufferInputStream、FileInputStream是三种基本的介质流,它们分别从Byte数组、StringBuffer、和本地文件中读取数据。PipedInputStream是从其他线程共用的管道中读取数据。

ObjectInputStream和所有的FileInputStream的子类都是装饰流(装饰器模式的主角)。意思就是FileInputStream可以通过一个String路径名创建一个对象,FileInputStream(String name)。而DataInputStream必须装饰一个类才能返回一个对象,DataInputStream(InputStream in)

Java I/O流详解

六. 输出字节流OutInputStream

OutputStream是所有输出类的父类,它是一个抽象类。

ByteArrayOutputStream、FileOutputStream是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。PipedOutputStream 是向与其它线程共用的管道中写入数据,
ObjectOutputStream 和所有FilterOutputStream的子类都是装饰流。

Java I/O流详解

七.节点流和过滤流

节点流:从特定的地方读写的流类,如磁盘或者一块内存区域。

过滤流:使用节点流作为输入或输出流。过滤流是已经存在的输入流或输出流连接创建的。

过滤流不能直接跟文件打交道,只能通过节点流进行相关的操作。可以通过其构造方法中看出:

FilterOutputStream(OutputStream out) 需要传入一个OutputStream。

在InputStream和OuputStream的子类中,FilterOutputStream和FiltDataInputStream是过滤类,其中有派生子类DataInputStream 和DataOutputStream数据输入流和输出流。

 

过滤流的主要特点是再输入输出数据的同时对所传输的数据做指定的类型或者格式的转换。

八.缓冲输出流BufferedOutputStream

该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字符写入底层输出流中,而不必针对每一个字节写入调用底层系统。

当缓冲区写满或者关闭输出流时,一次性输出到流,或者调用flush()方法主动将缓冲区输出到流。

使用过滤流类BufferedOutputStream和DataOutputStream装饰FilterOutputStream的例子:

public static void main(String[] args) throws IOException {

    //创建数据输出流
    DataOutputStream dos = new DataOutputStream(
            new BufferedOutputStream(new FileOutputStream("D:/itzhai/arthinking.txt")));
    byte a = 1;
    char b = 'a';
    int c = 2;
    //使用数据输出流对象的方法写出数据到输出流
    dos.write(a);
    dos.write(b);
    dos.write(c);
    //关闭数据输出流
    dos.close();
    //创建数据输入流
    DataInputStream dis = new DataInputStream(
            new BufferedInputStream(new FileInputStream("D:/itzhai/arthinking.txt")));
    //使用数据输入流的方法从输入流中读取数据
    System.out.println(dis.readByte() + dis.readChar() + dis.readInt());
    //关闭数据输入流
    dis.close();

使用DataInputStream和DataOutputStream数据文件流的一般步骤:

① 创建字节文件流对象
② 基于字节文件流对象建立数据文件流对象
③ 用数据文件流对象的方法对基本类型的数据进行输入/输出