Java NIO(New I/O)是一种可伸缩且非阻塞的 I/O,与传统的 Java IO 不同。它允许同时处理多个连接,并且能够更快地处理 I/O 操作,是构建高性能、可伸缩和并发应用程序的重要组成部分。
Java NIO 的核心是 Channel、Buffer 和 Selector。Channel 是连接源和目标的通道,Buffer 是数据传输的缓冲区,Selector 用于监视 Channel 中的事件并选择可用的 Channel 进行操作。下面我们来看一下 Java NIO 的示例。
Channel
在 Java NIO 中,所有的 I/O 操作都是通过 Channel 来进行的。Channel 类似于传统的流,但又有所不同。在 Channel 中,数据可以从 Channel 中读取到 Buffer 中,也可以将数据从 Buffer 写入 Channel 中。
(资料图片仅供参考)
下面是一个从文件中读取数据并输出到控制台的示例:
javaCopy codeimport java.io.*;import java.nio.*;import java.nio.channels.*;public class ChannelExample { public static void main(String[] args) throws IOException { RandomAccessFile file = new RandomAccessFile("test.txt", "rw"); FileChannel channel = file.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024); while (channel.read(buffer) != -1) { buffer.flip(); while (buffer.hasRemaining()) { System.out.print((char) buffer.get()); } buffer.clear(); } channel.close(); file.close(); }}
在上述示例中,我们使用 FileChannel 打开一个文件,并使用 ByteBuffer 分配一个缓冲区。然后使用 channel.read() 方法从文件中读取数据到缓冲区,使用 buffer.flip() 方法将缓冲区的指针移到缓冲区的起始位置,并使用 buffer.hasRemaining() 和 buffer.get() 方法遍历缓冲区中的数据。
Buffer
Buffer 是一个用于读写数据的缓冲区,它可以存储任何类型的数据,例如字节、字符、整数等等。Buffer 是一个抽象类,主要有以下几种子类:ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer 和 DoubleBuffer。
下面是一个使用 ByteBuffer 存储数据并将其输出到控制台的示例:
import java.nio.*;public class BufferExample { public static void main(String[] args) { ByteBuffer buffer = ByteBuffer.allocate(1024); buffer.put("Hello, world!".getBytes()); buffer.flip(); while (buffer.hasRemaining()) { System.out.print((char) buffer.get()); } buffer.clear(); }}
在上述示例中,我们使用 ByteBuffer 分配一个缓冲区,并使用 put() 方法将一个字符串存储到缓冲区中。然后使用 flip() 方法将缓冲区的指针移到缓冲区的起始位置,并使用 hasRemaining() 和 get() 方法遍历缓冲区中的数据。
Selector
Selector 用于监视 Channel 中的事件并选择可用的 Channel 进行操作。在 Java NIO 中,一个线程可以同时处理多个连接,因此它比传统的 Java IO 更快和更可伸缩。
下面是一个使用 Selector 监视 Channel 的示例:
javaCopy codeimport java.io.*;import java.nio.*;import java.nio.channels.*;public class SelectorExample { public static void main(String[] args) throws IOException { ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.socket().bind(new InetSocketAddress("localhost", 8080)); serverSocketChannel.configureBlocking(false); Selector selector = Selector.open(); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); while (true) { int readyChannels = selector.select(); if (readyChannels == 0) { continue; } for (SelectionKey key : selector.selectedKeys()) { if (key.isAcceptable()) { ServerSocketChannel server = (ServerSocketChannel) key.channel(); SocketChannel client = server.accept(); client.configureBlocking(false); client.register(selector, SelectionKey.OP_READ); } else if (key.isReadable()) { SocketChannel client = (SocketChannel) key.channel(); ByteBuffer buffer = ByteBuffer.allocate(1024); client.read(buffer); buffer.flip(); while (buffer.hasRemaining()) { System.out.print((char) buffer.get()); } } selector.selectedKeys().remove(key); } } }}
在上述示例中,我们使用 ServerSocketChannel 打开一个服务器,并使用 Selector 监视该服务器。当有客户端连接时,使用 accept() 方法获取客户端的 SocketChannel 并注册到 Selector 中,并指定监听 OP_READ 事件。当客户端向服务器发送数据时,使用 read() 方法将数据读取到 ByteBuffer 中,并使用 buffer.hasRemaining() 和 buffer.get() 方法遍历 ByteBuffer 中的数据。
标签:
-
java的NIO编程
JavaNIO(NewI O)是一种可伸缩且非阻塞的I O,与传统的JavaIO不同。它允许同时处理多个连接,并且能够更快地处理I O操作,是构
-
【世界速看料】美丽的祖国手抄报内容_美丽的祖国手抄报内容介绍
欢迎观看本篇文章,小升来为大家解答以上问题。美丽的祖国手抄报内容,美丽的祖国手抄报内容介绍很多人还不知道,现在让我们一起
-
中航高科:截至2023年3月31日收盘,公司股东户数71738户_全球实时
中航高科(600862)04月03日在投资者关系平台上答复了投资者关心的问题。
-
世界最新:2023上海注会报名费多少钱一门
2023上海注会报名费◆报名费:10元 人◆考务费:每科55元1 完成报名资格审核的报名人员,以及无需进行资格审核的报名人员、应届毕业生报名人员
-
90后手艺人:做纸的意义“不止于纸”
程玮爷爷程永芳做了一辈子制纸原材料,父亲程守海从16岁就在纸厂里干活,从小耳濡目染,父辈做纸的辛苦程玮看在眼里。
-
库里:掘金显然是一支非常出色的球队 我们必须打好开局减少失误 环球微资讯
明日NBA焦点战,勇士将客场挑战掘金。库里接受采访时谈到了这场比赛,他表示:“掘金显然是一支非常出色的球队,我们必须要有一个更好的开...
-
每日聚焦:深临其境 | 上山入水飞天!来深圳近距离偶遇TA
深圳生态资源丰富即使居住在都市里人们也可以随时亲近大自然能见到国家级保护野生动植物福田红树林湿地更是被列入国际重要湿地名录在2023年全
-
光韵达股票代码是多少 光韵达股票股吧股光-环球精选
哈喽小伙伴们 ,今天给大家科普一个小知识。在日常生活中我们或多
-
每日快讯!事关师资招聘,两部门发文:重点保障这些紧缺学科师资需求
重点保障中小学幼儿园紧缺学科师资需求,吸引科研机构等单位乐教适教的专业人员到中小学从事科学教育。日前,人力资源社会保障部、教育部联合
-
【环球聚看点】冬天睡觉穿秋衣秋裤好还是裸睡好?
这个要看自己的生活习惯,有的人喜欢裸睡,也有的人喜欢穿着睡衣睡觉,和季节没有太大的关系。不过如果是小孩子的话,还是建议穿着贴身衣服睡
-
全球微动态丨天降70亿!一位全球顶级富豪,或已悄然离世
近日,美国财政部的一份文件引发了大量关注。这份文件显示,该机构收到了一笔高达70亿美元的“遗产和赠与税”,这表明“全球最富有的人之一...
-
播报:新的泄漏细节三星Galaxy Buds 2 Pro的高级ANC确认定价
GalaxyBuds2Pro将保留GalaxyBudsPro的双驱动设计,但它们将配备较小的5 3mm高音扬声
-
天天热门:先天性近视眼能做激光手术吗_先天性近视
1、积极针对先天性近视治疗,是能够治愈的。2、这里需要强调的是,虽然近视散光有遗传因素,但是遗传到只能说明孩子有易感性,
-
“十大战略”进行时·蹲点调研丨河南积极推进科创金融服务 引金融“活水” 润科创“沃土”
□本报记者王昺南今年以来,郑州鸿盛数码科技股份有限公司上下的干劲更足了。原来,有郑州银行的1000万元授信给生产经营助力加油,公司可以购
-
环球快资讯:泰国球星赛名单公布梁靖崑陈幸同领衔13人出征,世乒赛5单5双待教练组定夺
泰国球星赛名单公布梁靖崑陈幸同领衔13人出征,世乒赛5单5双待教练组定夺,国乒,四强,梁靖崑,陈幸同,世乒赛,林高远,泰国球星赛,乒乓球比赛
-
今亮点!陈伟霆刘雯李沁同框,究竟是怎么一回事?
正文摘要:陈伟霆刘雯姐弟款同框,看起来有点帅,有点养眼,有么有准备换个屏保的妹子,这一对的look可以走起,而且呢看起来
-
粤交通厅预计海外侨胞、港澳台同胞返粤扫墓需求大幅增长
南沙大桥(资料图) 广东省交通运输厅供图中新网广州3月31日电(记者蔡敏婕)广东省交通运输厅31日发布消息称,相比
-
博鳌亚洲论坛“加强数据安全”分论坛举行
中国日报3月31日电(记者冯永斌)2023年3月31日,博鳌亚洲论坛2023年年会“加强数据安全”分论坛在海南博鳌举行。前巴西总统特别经济顾问、清华大
-
世界微速讯:苹果新AirPods Pro 2来了:换USB-C接口了
本周有开发者在苹果iOS16 4系统代码中发现型号为A3048的AirPods耳机,结合此前分析师郭明錤的消息,这大概率就是USB-C接口的AirPodsPro2,在下
-
全球聚焦:新明中国预计推迟至4月底之前刊发年报 将在4月3日起停牌
观点网讯:3月31日,新明中国控股有限公司公告,称将延迟刊发2022年业绩报告。据观点新媒体了解,新明中国表示将延迟刊发2022年经审核年度业绩
-
世界讯息:美国好日子快到头了:巴西“人民币结算”靴子落地,东盟也有动作
美国好日子快到头了:巴西“人民币结算”靴子落地,东盟也有动作,巴西,美国,东盟,华盛顿
-
【当前独家】快递包装、厨余垃圾和烟头频频往下扔……小区高空抛物4年多顽疾如何治?
浦东新区板泉路2101弄世博家园小区11号楼的居民反映,4年多来,小区高层住户长期高空抛物,将快递包装、厨余垃圾和烟头等杂物垃圾随手扔下,绿
-
22年高级经济师考试差几分,23年如何备考?来看张宁老师建议!
有考生咨询:22年高级经济师考试差几分,23年如何备考?快来看张宁老师的视频指导!video全屏观看效果更佳2023年高级经济师工商、人力、财政税
-
苏州新浒大酒店_关于苏州新浒大酒店介绍
1、苏州新浒大酒店位于苏州高新区浒墅关工业园浒杨路服务中心内。2、沪宁高速公路、312国道、京杭大运河、京沪铁路等重
-
【播资讯】汽车指示灯大全 仪表_汽车仪表盘指示灯大全
你们好,最近小活发现有诸多的小伙伴们对于汽车指示灯大全仪表,汽车仪表盘指示灯大全这个问题都颇为感兴趣的,今天小活为大家
-
环球滚动:冷轧钢板和热轧钢板的区别_热轧和冷轧的区别
1、一般热轧是冷轧的前一道工序;2、热轧轧制的原料是炼钢厂出来的钢坯;冷轧的原料是热轧卷;3、热轧的工艺是加热炉->粗轧
-
电力每日要闻(2023年3月31日)
电力每日要闻(2023年3月31日)政策国家能源局:加快推进能源数字化智能化发展3月31日,国家能源局发布关于加快推进能源数字化智能化发展的若
-
每日信息:塔图姆今日砍下生涯第22次40+ 超越皮尔斯升至队史第二
今日进行的NBA常规赛,凯尔特人客场以140-99击败雄鹿。
-
产业带里做直播,拼多多“拼”出正品心智
谁和用户站在一起,用户就选择和谁站在一起。拼多多要做的事永远是匹配,让合适的人在合适的场景下买到合适的东西。
-
每日视讯:公告速递:万家瑞尧灵活配置混合基金暂停向个人投资者开放申购、转换转入及定期定额投资业务
3月31日万家基金管理有限公司发布《关于万家瑞尧灵活配置混合型证券投资基金暂停向个人投资者开放申购、转换转入及定期定额投资业务的公告》。