一、“流”的概念

“流”是一个抽象的概念,它是对输入输出设备的一种抽象理解,在java中,对数据的输入输出操作都是以“流”的方式进行的。“流”具有方向性,输入流、输出流是相对的。当程序需要从数据源中读入数据的时候就会开启一个输入流,相反,写出数据到某个数据源目的地的时候也会开启一个输出流。数据源可以是文件、内存或者网络等。

二、“流”的分类

“流”序列中的数据可以是未经加工的原始二进制数据,也可以是经过一定编码处理后符合某种格式的特定数据,因此java中的“流”分为两种流:

1) 字节流:数据流中的最小的数据单元是字节,一次读入读出8位二进制;

2) 字符流:数据流中的最小的数据单元是字符,一次读入读出16位二进制,java中的字符是Unicode编码,一个字符占用两个字节。

三、“流”结构分类

“流”存在与java.io包中,主要包含四种基本的类,InputStream、OutputStream、Reader及Writer类,它们分别处理字节流和字符流:

输入/输出

字节流

字符流

输入流

Inputstream

Reader

输出流

OutputStream

Writer

它们之间的继承关系图为:

字节流:

c0eb7e440bbc635855595b96e6ec4ec2.gif

输入流

f83725d60b475475a76084ad24d185f1.gif

输出流

字符流:

52b9551ecf7934673c0fea54fd151951.gif

输入流

54786e43e3ef5561ffe71651b6df70f5.gif

输出流

四、“流”常用方法

InputStream为字节输入流,本身是个抽象类,必须依靠其子类实现各种功能,数据单位位字节(8bit)。常用方法有:

(1) public abstract int read( ):读取一个byte的数据,返回值是高位补0的int类型值。若返回值=-1说明没有读取到任何字节读取工作结束。

(2) public int read(byte b[ ]):读取b.length个字节的数据放到b数组中。返回值是读取的字节数。该方法实际上是调用下一个方法实现的

(3) public int read(byte b[ ], int off, int len):从输入流中最多读取len个字节的数据,存放到偏移量为off的b数组中。

(4) public int available( ):返回输入流中可以读取的字节数。注意:若输入阻塞,当前线程将被挂起,如果InputStream对象调用这个方法的话,它只会返回0,这个方法必须由继承InputStream类的子类对象调用才有用,

(5) public long skip(long n):忽略输入流中的n个字节,返回值是实际忽略的字节数, 跳过一些字节来读取

(6) public int close( ) :我们在使用完后,必须对我们打开的流进行关闭.

OutputStream为字节输出流,常用方法有:

(1) public void write(byte b[ ]):将参数b中的字节写到输出流。

(2) public void write(byte b[ ], int off, int len) :将参数b的从偏移量off开始的len个字节写到输出流。

(3) public abstract void write(int b) :先将int转换为byte类型,把低字节写入到输出流中。

(4) public void flush( ) : 将数据缓冲区中数据全部输出,并清空缓冲区。

(5) public void close( ) : 关闭输出流并释放与流相关的系统资源。

Reader为字符输入流,常用方法有:

(1)  public int read() throws IOException: 读取一个字符,返回值为读取的字符

(2)  public int read(char cbuf[]) throws IOException:读取一系列字符到数组cbuf[]中,返回值为实际读取的字符的数量

(3)  public abstract int read(char cbuf[],int off,int len) throws IOException:读取len个字符,从数组cbuf[]的下标off处开始存放,返回值为实际读取的字符数量,该方法必须由子类实现。

Writer为字符输出流,常用法有:

(1) public void write(int c) throws IOException:将整型值c的低16位写入输出流

(2) public void write(char cbuf[]) throws IOException:将字符数组cbuf[]写入输出流

(3) public abstract void write(char cbuf[],int off,int len) throws IOException:将字符数组cbuf[]中的从索引为off的位置处开始的len个字符写入输出流

(4) public void write(String str) throws IOException:将字符串str中的字符写入输出流

(5) public void write(String str,int off,int len) throws IOException:将字符串str 中从索引off开始处的len个字符写入输出流

(6) flush( ) :刷空输出流,并输出所有被缓存的字节。

(7) close()  :关闭流

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐