java的NIO编程
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 中的数据。
标签:
精彩推送
世界热点!美银证券:维持中国光大银行(06818.HK)“买入”评级 目标价升至2.8港元
美银证券发布研究报告称,维持中国光大银行(06818 HK)“买入”评级,将2023-24年每股盈测下调6%至7%,...
全球快播:海南多市县发布冰雹橙色预警信号,未来几天雨雨雨
小伙伴出行的时候要注意啦海南多市县发布冰雹橙色预警信号海口市气象台2023年03月27日08时02分发布冰雹...
长亮科技:公司研发中心目前设立有人工智能研究的专门机构,正在开展相关场景化研究工作
长亮科技30034803月27日在投资者关系平台上答复了投资者关心的问题投资者董秘你好请问公司有涉及人工智...
新闻快讯
X 关闭
X 关闭
新闻快讯
- java的NIO编程
- nh文件用什么打开 当前热文
- 即时焦点:镍:低库存再遇去库 镍价“一枝独秀”
- 华谊集团: 独立董事关于公司十届二十二次董事会审议的关联交易事项发表的独立意见
- 世界热资讯!华夏银行外汇牌价一览2023.04.03 (人民币)
- 安徽多地将有强降水 局地雨量或超100毫米-世界热讯
- 每日焦点!李铁资本版图盘点
- 天天热门:2023黑龙江省公务员考试资格复审后职位调整通知
- 世界快资讯丨郑州新郑成功出让两宗面积合共超百亩宅地 成交总价约1.86亿元
- 春天的外套该怎么穿?3个要点3个搭配技巧,新手秒变时髦精|信息
- 西部地理标志展示推广中心落地成都 当前简讯
- 省时省力 环保方便 不用排队打印片子了!济南市中心医院推出“云胶片”服务
- 2023年4月购酒指南:白酒价格走向平稳
- 环球快看点丨日本各地哀悼坂本龙一:他曾斥责日政府强建美军基地 一生坚持反战和平思想
- 诈骗罪立案追诉期限有多久?夸境诈骗案检察到法院多长时间能判? 要闻
- 全球观焦点:特种作业操作证查询叉车证(特种作业操作证查询)
- 恒达集团控股延迟发布2022年全年业绩 4月3日起停牌
- 【环球聚看点】构建全域清廉格局 吴堡加强廉洁文化建设
- 全球热点!关晓彤140w新造型上热搜,这曲线......难怪被网友夸爆!
- 羊奶粉市场迎重磅玩家 达能携两款新品加码细分赛道_今热点
- 焦点观察:3月31日基金净值:交银经济新动力混合A最新净值2.8725,跌0.5%
- 环球实时:房地产企业偷税漏税的方式是哪些
- 《文心雕龙》何以成经典文学作品
- 环球观点:万向钱潮(000559):3月31日北向资金增持6.82万股
- 蔚蓝档案怎么预约-预约方式介绍|世界速递
- 深圳北站在哪个区哪个镇_深圳北站在哪个区|全球快播报
- 头条焦点:徽商银行2022年实现归母净利133.98亿元 同比增长16.91%
- 意大利央行行长:欧洲央行加息将导致欧元区银行出现亏损
- 吉林省科技馆、吉林省博物院、长春中国光学科学技术馆清明节闭馆时间调整 世界看热讯
- 奇葩!分宜男子一晚上两次酒驾被查,自称“肠子都悔青了”!
- 天天速看:陈加宝暗访涉煤领域生态环境保护工作
- 雄鹿领跑联盟两大关键:霍乐迪逆生长屡创新高 大洛转型攻防一体_天天要闻
- 全球观速讯丨豆神教育被申请破产审查
- 2023中日友好医院清明节五一假期门诊安排
- 凯盛新材:公司密切关注钠离子电池领域发展动向,正在做相关基础性技术研究 环球今日报
- 天天热头条丨有趣的内容“硬核”的知识 知识博主助力网络学习
- 世界新资讯:广汽菲克销售公司被恢复执行3088万
- 西南证券:维持万物云(02602)“买入”评级 “蝶城”布局持续落地
- 复盘:栖海澐颂,大户型比小户型更能升值?
- 3月31日日经225指数开盘上涨0.81%,韩国Kospi指数上涨0.28%_天天热点
- 普信女什么意思_普信女的意思
- 基孔制与基轴制的区别及应用_基孔制与基轴制的区别 观天下
- 天天看点:太狡猾!塞拉斯借他人之口,力保火箭队帅位?他也不想离开航天城
- 12368热线传递司法温度
- 育肥猪饲料配方和饲养方法? 环球观天下
- 全球快资讯丨有头部券商被传整体降薪三至五成是什么情况
- 淄博烧烤出“圈”,拉动当地酒旅业发展
- 林高远赢林诗栋捍卫主力地位!战王楚钦争门票,陈幸同对决王艺迪
- 世界通讯!中国建材股份连续六年荣获上海证券交易所“公司债券优秀发行人”称号
- 辽宁举行老旧小区改造现场观摩会 全力推动一季度开门红|每日热议