java的输入输出流类型_理解JAVA输入输出流

一、IO流作用

IO流就是用来处理设备上的数据,包括文件,磁盘,网络等

二、分类

按处理的数据类型不同:字符流、字节流

按流向不同:JAVA 中流的处理是单向的,分为输入流和输出流

三、抽象类

1、字节流抽象类

InputStream 输入流

OutputStream输出流

2、字符流抽象类

Reader 输入字符流

Writer 输出字符流

四、JAVA中流体系架构

6c715683f7d7f82e58e6d7b3b28fab36.png

有一些对流进行操作的基本的方法,我们以文件输入输出流进行说明:

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

fcd309b632393c4dd09ff157b5c0bc73.png

假如有个文件a.log 里面存放的数据是

f31db110b9c4bdd9707ee0c684d9d0c7.png

(1)read() 从输入流中读取数据的下一个字节,返回0到255范围内的int字节值

通常的用法是

2f76ec740e2e82b82747b9ce67a5fd63.png

返回值

fddf0356a9fc488a80d17161d30f17ec.png

(2)read(byte[]) 从输入流中读取的一定数量字节数并将它们存储到缓冲区数组中

通常的用法是:

0450c76fbdb3730a6d27f5e12b40ade8.png

返回值为:

aaa

2、OutputStream是所有输出字节流的子类,他也是一个抽象类

1cf556f8c7e68a5dd5861d484e3c5310.png

(1)write(int) 写入一个0-255范围的int字节到输出流

362e7c95561ce59d27d77a72b4b28159.png

然后我们发现b.log里的内容为a:

e7116fb976d46d937b12861fdcac1a68.png

(2)write(byte[]) 写入byte数组中的数据到输出流

d2268067d7514f36a1f284c9cd5445bb.png

然后我们发现b.log文件中的数据为123

d94bddcf4075a358e47cab3861035d01.png

3、Reader是所有的输入字符流的父类,它是一个抽象类

简单使用方式同InputStream,例子如下

0c16fcafdd6248e212a0e71c8ddf34e7.png

4、Writer是所有的输出字符流的父类,它是一个抽象类

简单使用方式同OutputStream,例子如下

5cec8ce6b8d1d7ff018291813f32816d.png

写入到b.txt文件的数据

c497c6c8df5e5a3f7a271aeea0fc0310.png

五、IO流中的设计模式

JAVA中的IO流有很多种,但是都会按照需要继承InputStream,OutputStream,Reader,Writer的一种,同时为了更好的扩展这些类,采用了装饰者模式。

1、首先举一个简单的例子

0f18e054315dcaa8d3816642dbb0d0a7.png

比如上面这个文件输入流,会读取文件中的字节,然后打印出来,如果我们要增强这个类,比如要使用缓冲区怎么办,我们可以使用BufferedInputStream

12920d51a54c3c04f857b48438e6d8d3.png

我们查看一下BufferedInputStream的构造函数

eaa78ff4bbc53c01e1652224c85d8f40.png

发现这个函数实例化的时候需要传一个InputStream,然后在我们的例子中fileInputStream是继承了InputStream的类,所以我们可以交给BufferedInputStream使用,同时BufferedInputStream也会继承

InputStream的抽象类,那么就一定会实现抽象类的所有方法,进而实现了类的增强,其他的类同理

六、使用规律总结

(1)明确要操作的数据是数据源还是数据目的(要读还是要写)?

源:InputStream Reader

目的:OutputStream Writer

(2)明确要操作的设备上的数据是字节还是文本?

字节:InputStream

文本:Reader

字节:OutputStream

文本:Writer

(3)明确数据所在的具体设备?

硬盘:文件 File开头

内存:数组,字符串

键盘:System.in

网络:Socket

(4)明确是否需要额外功能?

需要转换—转换流 InputStreamReader OutputStreamWriter

需要高效—缓冲流 Bufferedxxx

多个源—序列流 SequenceInputStream

对象序列化—ObjectInputStream,ObjectOutputStream

保证数据的输出形式—打印流PrintStream Printwriter

操作基本数据,保证字节原样性—DataOutputStream,DataInputStream

80a18ece01427e9d40bbb2d30172bb8b.png


版权声明:本文为weixin_31179927原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。