従来のIOとNIOの違い
?
従来のIO
1.単方向
2.ストリーム指向
?
NIO
1.双方向
2.チャネルは送信を担当し、バッファは保存を担当します
?
NIOの概念とコードのデモ
1.キャッシュ
直接キャッシュ領域と間接キャッシュ領域
非直接缓存区 通过allocate方法分配缓存区,缓存区直接建立在JVM的内存
直接缓存区 通过 allocateDirect分配缓存区 建立在os缓存
数据类型不同 提供了对应的缓存区(boolean除外)
ByteBuffer(常用)
CharBffer
缓存区的管理方式几乎一致 都是用allocate分配
缓存区存储数据有俩个方法
put 存入数据到缓冲区和
get 从缓存区获取数据
缓存区的核心属性
position = 0;缓存区正在操作数据的位置
limit;表示缓存区最大存储的数据容量 limit后的数据不能读写
capacity; 缓存区最大存储容量 一旦声明不能改变
バッファの読み書き後に属性が変更される
間接バッファアイコン
直接バッファアイコン
コードデモ
https://gitee.com/WenHaiGo/code-mark/blob/master/IO/src/NIO/TestBuffer.java
2.チャネル
ソースノードとターゲットノード間の接続は、Java NIOのキャッシュ領域でのデータの送信を担当します。チャネル自体はデータを格納せず、キャッシュ領域と併せて送信する必要があります。
java.nio.channels.Channel接口
* 主要实现类
* --FileChannl 本地文件
* --SocketChannl TCP
* --ServerSocketChannl TCP
* --DataGramChannel UDP
1.チャンネルを取得する方法
-
Javaは、チャネルをサポートするクラスにgetChannel()メソッドを提供します
ローカルIO
FileInputStream / FileOutPutStream
RandomAccesFileネットワークIO
ソケット
サーバーソケット
DatagramSocket -
JDK 1.7以降、静的メソッドopen()が各チャネルに提供されました
-
JDK 1.7以降のファイルユーティリティクラスのNewByteChannel()
コードデモ
https://gitee.com/WenHaiGo/code-mark/blob/master/IO/src/NIO/TestChannelByCopyFile.java