🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大小厂~💐
🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥
NIO全称non-blocking IO (非阻塞IO) New 新IO 是指JDK1.4+提供的一个新的API(新IO),为所有原始数据(除boolean类型以外)提供缓存支持的 数据容器,可以对数据进行读和写操作。
channel通道,可以通过它 读取和写入数据。 类似于 传统IO中的 stream流。
# 区别:
1> 传统IO中的steam流 是单向的(InputStream 输入流 或 OutputStream 输出流)
2> channel是读写数据的双向通道。可以从channel中把数据读到buffer中;也可以把buffer中的数据定入channel
常见的channel有:
FileChannel 用于对文件操作的channel
DatagramChannel UDP网络编程时使用的channer
SocketChannel TCP网络编程时使用的通道,可用于server端和client端
ServerSocketChannel TCP网络编程时使用的通道,专用于server端
Buffer缓冲区,用于 缓冲读或写的数据。是一个固定数据量的数据容器。 常见的缓冲区有: ByteBuffer 以字节为单位的缓冲区 ShortBuffer short为单位 IntBuffer int为单位 LongBuffer long为单位 FloatBuffer float为单位 DoubleBuffer double为单位 CharBuffer char为单位
Selector 选择器,用于 对NIO中的多个channel进行检查和选择的,检查多个channel实例 哪些已经准备好进行读写操作了,通过选择器 选择对应的channel进行数据操作。
服务器的工作方式:
1> 多线程的方式
2> 线程池的方式
3> selector的方式
步骤1> 准备一个.txt文件(e:\\data.txt),并输入简单的字符内容
1234567890hello
步骤2> NIO的第一个示例
public class First {
public static void main(String[] args) throws IOException {
// 创建FileChannel对象
FileChannel channel = new FileInputStream("e:\\data.txt").getChannel();
// 分配缓冲区内存
ByteBuffer buffer = ByteBuffer.allocate(10); // 默认写操作
// 取文件
while (true){
// 使用channel读数据,存入buffer
int len = channel.read(buffer); //返回-1代表文件读取结束
System.out.println("实际读到的字节数: " + len);
if (len == -1) {// 检查 是否读取到文件结尾
break;
}
// 显示buffer中的内容 读到了文件的正常内容,文件还没到结尾
buffer.flip(); // 切换buffer为 读模式
while (buffer.hasRemaining()){ // 判断buffer中是否有未读的内容
byte b = buffer.get(); // 读取buffer区中的内容
System.out.println("读到的内容:" + (char)b);
}
buffer.clear(); // 切换buffer为 写模式
}
}
}
1> 往buffer中写数据,可以通过 channel.read(buffer)
2> 切换buffer为 读模式, 通过 buffer.flip()
3> 从buffer中读取数据, 调用buffer.get()
4> 切换buffer为 写模式, 通过 buffer.clear() 或 buffer.compact()
如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。