java八股!2

IO流

好短 就三个问题(io流,区别,NIO实现)

io流基本认识

io流分为字节流和字符流两大类,提供一种灵活的输入和输出数据的方式。
字节流:
inputStream和outputStream,是所有字节输入输出流的抽象基类,提供输入和输出字节的方式。
fileinputStream和fileOutputStream是用于文件读取和写入的字节流类,
byteArrrayInputStream类是用于从字节数组中读取和写入的字节流类。

字符流:
reader和writer,是所有字符输入流和输出流的抽象基类,分别用于读取和写入字符
fileReader和fileWriter,文件
bufferedReader和bufferedWriter,提供缓冲区,提高读取和写入的效率

还有一种高级流,ObjectInputStream和ObjectOutputStream,用于读取和写入对象,可以序列化和反序列化对象

字节流和字符流的区别(中文,底层设备,缓冲区,应用场景)

一个字符=两个字节,中文是两个字节,因此使用字节流传输中文的时候可能会产生乱码。
底层设备可以接受的数据类型还是字节类型,有时候需要将字符串转换成字节流写入底层设备。
字节流在操作时本身不会用到缓冲区,是直接对文件进行操作,字符流操作时先写入缓冲区。
使用场景:字符流通常用于处理纯文本数据,字节流通常用于处理图像,视频,ppt,word类型数据,也可以用于处理纯文本。但字符流不可以用于处理图像类型数据。

I/O模型(4种(可以看做3种))(以及使用场景的区别)

BIO:阻塞,同步,线程等待IO完成再进行其他操作,等待过程中阻塞,在高并发时会影响性能
NIO,非阻塞,IO时可以进行其他操作,线程通过不断轮询的方式查看io操作是否完成,或使用回调函数等机制。在高并发时比BIO性能好,但轮询会影响CPU效率。
IO多路复用:一个线程管理多个连接。比如java中的selector类
AIO:异步IO,完成后进行回调

NIO的实现机制

组件有三个,channel,selector(选择器),buffer
channel是NIO中的一个抽象概念,类似于传统的流,但更加灵活,channel可以是读,写或读写的,比较常用的channel有fileChannel,SocketChannel和ServerSockeChannel

buffer:缓冲区,channel从buffer中读取数据,将数据写入到buffer中。buffer提供了对数据哈的结构性访问,可支持的数据类型覆盖了能通过io发送的基本数据类型。

selector选择器:允许一个线程同时监控多个channel,当某个channel法生读写事件时,可以通过selector获得通知。

NIO的整体工作流程:
首先打开channel,通过fileChannel,socketChannel或ServerSocketChannel的.open打开一个channel

创建一个或多个buffer用于读写数据的缓冲区

写:将数据写入buffer,然后buffer写入channel
读:channel写入数据到buffer,从buffer中读取到数据

将channel注册到selector,当channel上发生感兴趣的事件时,选择器会通知线程。

处理事件:在一个循环中调用selector的select方法,该方法会阻塞至少等到一个注册的channel上发生了事件,然后通过迭代selectedKeys获取selectionKey定位到具体的channel并处理事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值