当前位置: 首页 >> 商务
java的NIO编程|世界微资讯
来源:腾讯云     时间:2023-04-03 19:36:11

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不同。它允许同时处理多个连接,并且能...
冷冻包子可以直接放微波炉吗(冷冻的包子可以直接放微波炉吗) 最佳答案冷冻包子可以直接放微波炉,一般只需要放在微波炉中,用中高火加热1-2分钟就能够熟,相比用火炉...
顽强拼搏奋勇搏击内蒙古女子拳击向着更高目标奋进 来源:中国体育报日前中国女子拳击队在印度新德里举行的2023世界女子拳击锦标赛中斩获佳绩。来自内蒙古...
世界热消息:船长的钥匙能开出什么_魔兽世界船长的钥匙 1、你打那个钥匙有可能任务需要·也有可能在那个附近有箱子需要这个钥匙·开锁技能只有盗贼有。本文分享...
全球热门:女子景区看演出疑被骚扰,警方回应! 来源|雁塔公安、九派新闻4月3日,西安雁塔公安发布消息:关于网传“女子景区看演出疑被骚扰”事件,该局...
德州亚裔驾照个人资料失窃,受害人信用卡遭疯狂盗刷-全球快消息 自媒体曝光纽约华人黑帮组织利用德州州府网站漏洞盗用亚裔州民资料,继而向德州交通部门申请补发驾照、...
全球与中国心理测验行业发展前景 全球与中国心理测验行业未来发展趋势预测 心理测验(mentaltest)是根据一定的法则和心理学原理,使用一定的操作程序给人的认知、行为、情感的心理...
【当前独家】《红旗漫卷军威壮》 本期节目带来歌曲《红旗漫卷军威壮》。
啫啫排骨的做法窍门_啫啫排骨 你们好,最近小活发现有诸多的小伙伴们对于啫啫排骨的做法窍门,啫啫排骨这个问题都颇为感兴趣的,今天...
工银瑞信国证港股通科技ETF净值下跌2.05% 请保持关注-即时 金融界基金04月03日讯工银瑞信国证港股通科技ETF基金03月27日上涨0 23%,现价0 889元,成交5691 93万...
王导:黄金1955附近多,目标1995 黄金在1950强支撑上运行,操作就很简单了,在1955附近做多,看1995目标位。周末金市无重要消息影响,可...
锂价暴跌,又一家车企宣布降价|焦点速读 4月1日,吉利汽车旗下新能源品牌——几何宣布降价补贴:由于新能源汽车成本下调,开启回馈活动,最高可...
全球头条:最新出炉,公募基金去年现万亿亏损,四大费用创历史新高 最新出炉,公募基金去年现万亿亏损,四大费用创历史新高
券商去年揽入基金分仓佣金近189亿元,前三十名券商占近九成份额 券商去年揽入基金分仓佣金近189亿元,前三十名券商占近九成份额,基金,外资,集中度,分仓佣金
甘肃省稳步推进乡村振兴投资基金项目落地|全球信息 甘肃省稳步推进乡村振兴投资基金项目落地
【天天热闻】新股怡和嘉业上市首日高开,现涨超100% 11月1日上午,新股怡和嘉业上市首日高开,现涨超100%,市值达153亿元,换手率达248%。公司主营呼吸健康...
大便黏腻排不净放屁多是什么情况吃什么药_大便黏腻排不净放屁多是什么情况-每日热闻 1、大便混浊、不洁、放屁多为慢性肠炎或肠道功能紊乱所致。2、大便粘稠主要是肠道感染引起的慢性肠炎的...
全球今头条!芒果从大头还是从小头剥好剥 芒果怎么剥皮好吃 芒果是生活中比较常见的一种水果,它含有多种营养成分,适量食用对身体有一定的好处。芒果一般都是剥皮...
全球百事通!安阳市圣君实业有限公司 1、圣君实业有限公司始建于2000年。本文到此分享完毕,希望对大家有所帮助。
环球快报:小学生盘串的样子,我见了都要喊叔 小学生盘串的样子,我见了都要喊叔
以网络“好言值”赞中国“好颜值”|评论 白木2023“好评中国”网络评论大赛启动仪式暨“好评中国”网络评论创新论坛3月31日上午在长沙举行,欢迎...
农业经济管理学什么专业_农业经济管理类包括哪些专业-全球播报 1、农业经济管理类专业包括农林经济管理、农村区域发展。2、专业名称和代码:农业经济管理类,代码12030...
美味进化什么时候出 公测上线时间预告|世界速讯 导读:最近很多玩家都在关注美味进化这款手游,想知道具体的公测时间,美味进化会经过封测、删档内测、...
林德叉车图片大全大图_林德叉车价格一览表 1、H25t标准车市场价格在23-25之间太远的地方加点运费H160 1200就贵了136-150万之间成交价格
精彩看点:19位院士百余名船海领域专家共探海洋命运共同体建设 中国青年报客户端北京3月31日电(中青报·中青网记者孟佩佩)今天,2023年海洋命运共同体建设高端论坛暨...

广告

X 关闭

广告

X 关闭