欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

J02-Java IO流总结二 《概述》

程序员文章站 2022-05-25 15:45:33
1 流的概念 流是一个信息的通道,通过通道可以访问通道连接的文件对象。 2 流的分类 根据流中数据的流向,可分为输入流和输出流 根据流中数据的流向,可分为输入流和输出流 输入流:从其他的地方流入到程序内存中的,比如InputStream、Rreader 输出流:从程序内存将数据写出到目的地。比如:O ......

1  流的概念

流是一个信息的通道,通过通道可以访问通道连接的文件对象。

 

2  流的分类

  • 根据流中数据的流向,可分为输入流输出流

输入流:从其他的地方流入到程序内存中的,比如inputstream、rreader

 输出流:从程序内存将数据写出到目的地。比如:outputstream。writer

 

  • 根据流处理的数据单元,可分为字节流字符流

              字节流:以字节为单位来处理数据的流 。inputstream  outputstream

              字符流:以字符为单位处理的流,rreader,writer

注:

1) 字符流只能处理文本数据。事实上,字符流是封装了的字节流,通过封装,增加了字节和字符之间转换的功能——关于这点后面将会介绍到。

2) 字节流所有的数据都能处理。 功能强大的字节流。

 

  • 根据数据源的不同,可以分为节点流处理流

              节点流:直接和数据源相连的流,比如 fileinputstream、fileoutputstream

              处理流:以流为数据源的流,比如bufferedinputstream、bufferedoutputstream

 

3  四大io抽象类

inputstream、outputstream和reader、writer类是所有io类的抽象父类,了解一下这个四个抽象类的作用,然后再通过它们具体的子类熟悉相关的用法。

 

3.1 inputstream

inputsteam抽象类是表示字节输入流的所有类的父类。inputsteam是一个抽象类,它不可以实例化,数据的读取需要由它的子类来实现。根据节点的不同,它派生了不同的节点流子类 。

继承自inputsteam的流都是用于向程序中输入数据,且数据的单位为字节(8 bit)。

常用方法:

int read() throws ioexception

 该方法从流中读取一个字节的数据,并将字节的值作为int类型返回(0-255之间的一个值),注:这里返回的int数值中的低八位保存了读取到的字节的数据。如果未读出字节则返回-1(即:如果read()方法返回-1则表示读取到了流的末尾)。

另外需要注意的是该方法的结果是以int类型返回的!之所以以int类型返回,是为了避免和流的末尾 -1 产生冲突——由上面可知,我们是根据read()方法的返回结果是否为-1(注:-1的二进制补码形式为1111 1111)来判断是否读到了流的末尾的,然而在读到流的末尾之前,有时候是有可能会读到1111 1111这样的文件数据的,这个时候如果以byte形式返回,那么返回的就是-1,则会误判为读到了流的末尾,这是不正确的。如果是以int形式返回,则不会有这种问题,这时候,会将读到的字节做b & 0xff操作,以取得int形式并返回。在后面的自己实现的bufferedinputstream中可以看到这个实现。

 

int read(byte b[]) throws ioexception

 该方法每次从流中读取最多 b.length 长度个字节数据,如果流中剩余的字节数小于字节数组的长度,那么就全部读取进来。方法的返回值是每次读取时读到的字节数,若读取到了流的末尾,则返回-1。

 

int read(byte b[], int off, int len) throws ioexception

 该方法跟上面的第2个方法差不多同样意思,只不过它是每次从流中读取最多 len 长度个字节数据,并放到字节数组b的 [off, off + len)位置中,如果流中剩余的字节数小于len,那么就全部读取进来。方法的返回值同样是每次读取时读到的字节数,若读取到了流的末尾,则返回-1。

该方法使用得相对较少一点。

 

void close() throws ioexception

 关闭输入流对象,释放相关系统资源。

 

3.2  outputstream

outputstream是所有字节输出流抽象父类。输出流接收输出字节并将这些字节发送到某个目的地。

常用方法:

void write(int b) throws ioexception

 往输出流中写入一个字节b对应的整数int,注意这里写入的是int的低八位中的字节数据

 

void write(byte b[]) throws ioexception

 将整个字节数组b[] 中的内容都写入到输出流中

 

void write(byte b[], int off, int len) throws ioexception

 将数组的[off, off + len)区间上的数据写入到输出流中

 

void flush() throws ioexception

 刷新缓冲区,将缓冲区中的数据写出到目的地。输出流关闭的时候也会将缓冲区中的内容写出到目的地。

 

void close() throws ioexception

 关闭流对象,释放相关系统资源。

 

 

3.3  reader

reader是所有字符输入流抽象父类,在该流中传输的数据单位为字符。事实上reader和inputstream中的常用方法是大同小异的,只不过inputstream是以字节为单位从流中读取数据,而reader是以字符为单位读取数据。

常用方法:

int read() throws ioexception

  读取一个字符的数据,并将字符的值作为int类型返回(0-65535之间的一个值,即unicode值)。如果未读出字符则返回-1(返回值为-1表示读取结束)。

 

int read(char cbuf[]) throws ioexception

 每次从流中读取最多 cbuf.length 长度个字符数据,如果流中剩余的字符数小于cbuf数组的长度,那么就全部读取进来。该方法的返回值是每次读取时读到的字符数,若读取到了流的末尾,则返回-1。

 

int read(char cbuf[], int off, int len) throws ioexception

 该方法每次从流中读取最多 len 长度个字符数据,并放到字符数组cbuf的 [off, off + len)位置中,如果流中剩余的字符数小于len,那么就全部读取进来。方法的返回值是每次读取时读到的字符数,若读取到了流的末尾,则返回-1。

 

 

3.4 writer

writer是所有字符输出流抽象父类,在该流中传输的数据单位为字符。

常用方法:

void write(int c) throws ioexception

 向输出流写入一个字符数据,写入的字符数据为参数b的低16位

 

void write(char cbuf[]) throws ioexception

 将字符数组cbuf中的数据写入输出流。

 

void write(char cbuf[], int off, int len) throws ioexception

 将字符数组cbuf中的 [off, off + len)部分的数据写入输出流。

 

void write(string str) throws ioexception

 将字符串str中的字符写入到输出流中,方法的源码如下:

 

public void write(string str) throws ioexception {
    write(str, 0, str.length());
}

 可见它底层调用的是下面的第5个方法。

 

void write(string str, int off, int len) throws ioexception

 将一个字符串从off开始的len个字符写入到输出流