传统IO和NIO的区别
传统IO
1、单方向
2、 面向流的
NIO
1、双向的
2、channel负责传输,buffer负责存储
NIO概念以及代码demo
1.缓存区
直接缓存区和非直接缓存区
非直接缓存区 通过allocate方法分配缓存区,缓存区直接建立在JVM的内存
直接缓存区 通过 allocateDirect分配缓存区 建立在os缓存
数据类型不同 提供了对应的缓存区(boolean除外)
ByteBuffer(常用)
CharBffer
缓存区的管理方式几乎一致 都是用allocate分配
缓存区存储数据有俩个方法
put 存入数据到缓冲区和
get 从缓存区获取数据
缓存区的核心属性
position = 0;缓存区正在操作数据的位置
limit;表示缓存区最大存储的数据容量 limit后的数据不能读写
capacity; 缓存区最大存储容量 一旦声明不能改变
读写buffer后的属性变化
非直接缓冲区图示
直接缓冲区图示
代码demo
https://gitee.com/WenHaiGo/code-mark/blob/master/IO/src/NIO/TestBuffer.java
2、通道
源节点和目标节点的连接,在Java NIO中负责缓存区数据的传输,Channel本身不存储数据,需要配合缓存区进行传输
java.nio.channels.Channel接口
* 主要实现类
* --FileChannl 本地文件
* --SocketChannl TCP
* --ServerSocketChannl TCP
* --DataGramChannel UDP
1、如何获取通道
-
Java针对支持通道的类提供了getChannel()方法
本地IO
FileInputStream/FileOutPutStream
RandomAccesFile网络IO
socket
serversocket
DatagramSocket -
JDK 1.7之后对各个通道提供了静态方法 open()
-
JDK 1.7之后对Files工具类的newByteChannel()
代码demo
https://gitee.com/WenHaiGo/code-mark/blob/master/IO/src/NIO/TestChannelByCopyFile.java