1.NIO之零拷贝
先简单说一下什么叫深拷贝浅拷贝?
深拷贝是指 两个对象相互独立的copy
浅拷贝 引用名不同
零拷贝技术
Channel负责传输,Buffer负责存储
传统IO
File 文件类
字符流 字节流
Reader类 Stream 类
out in 和 read Writer 都是基于计算机来说的
FileOutputStream 文件流
BufferedOutputStream 用于优化文件流 增加一个缓存区
用字节流还是字符流
其实底层都是字节,我们使用字符是为了处理一些文本和字符串提高性能
如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点
NI
Channel Buffer select
Channel :
这些是Java NIO中最重要的通道的实现:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
FileChannel 从文件中读写数据。
DatagramChannel 能通过UDP读写网络中的数据。
SocketChannel 能通过TCP读写网络中的数据。
ServerSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。
file .getChannel
Buffer
基本用法 使用Buffer读写数据一般遵循以下四个步骤:
- 写入数据到Buffer
- 调用
flip()
方法 - 从Buffer中读取数据
- 调用
clear()
方法或者compact()
方法
ByteBuffer buf = ByteBuffer.allocate(
48
);
inChannel.read(buf);
追加写入文件
创建文件输出流加上参数 true
FileOutputStream(file,true)
BIO NIO AIO 详解
对于BIO 请求同步阻塞,等待结果
对于NIO 不阻塞 没有结果返回 ,用 select 一直轮询 查看
对于AIO 不阻塞 异步 没有轮询 ,由客户端通知
用取外卖的例子说明
BIO 我走到小区门口的外卖柜 发现没有到 就一直等着外卖员 送到了 我再走
NIO 我走到小区门口外卖贵 没有 回家了 然后放了一个监视器 每几秒钟看一眼到没到 到了再去取
AIO 我打电话告诉小区保安 我有一个外卖 。 小区保安看到外卖后给我打电话 我去取。
用缓存区来解释