
JavaNIO(NewI O)是一种可伸缩且非阻塞的I O,与传统的JavaIO不同。它允许同时处理多个连接,并且能够更快地处理I O操作,是构
腾讯云 2023-04-04 04:21:35
Java NIO(New I/O)是一种可伸缩且非阻塞的 I/O,与传统的 Java IO 不同。它允许同时处理多个连接,并且能够更快地处理 I/O 操作,是构建高性能、可伸缩和并发应用程序的重要组成部分。
(资料图片仅供参考)
Java NIO 的核心是 Channel、Buffer 和 Selector。Channel 是连接源和目标的通道,Buffer 是数据传输的缓冲区,Selector 用于监视 Channel 中的事件并选择可用的 Channel 进行操作。下面我们来看一下 Java NIO 的示例。
在 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 是一个抽象类,主要有以下几种子类: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 用于监视 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 中的数据。
JavaNIO(NewI O)是一种可伸缩且非阻塞的I O,与传统的JavaIO不同。它允许同时处理多个连接,并且能够更快地处理I O操作,是构
1、你对连接手机的电脑授权了么。2、高级里面有一个对这台电脑授权,授权以后就显示了。3、一部手机最多可对5台电脑授权,不
01交易的一个原则解决两个问题这个原则就是:买强卖弱!为什么要买强卖弱?在操作中你是不是也是在按照这个原则在做?其中原因不明白就要多想
在护卫舰07诞生之前,比亚迪车系中并未出现过“大五座”定位的SUV车型,它的到来补足了这一细分品类的缺失。作为比亚迪海洋网车型,护卫舰07在
AOP的核心思想是将程序中的不同关注点分离出来,然后通过将这些关注点独立编写代码来实现。这些关注点可以是与程序功能无关的东西,如日志记录
1、股票市盈率又叫称“本益比”。市盈率可以为投资者提供投资参考意见。市盈率较低,说明投资回收期较短,投资风险较小,股票的投资价值较
总有些人喜欢评价梅西和C罗来获取流量,这不所谓的曼联名宿内维尔,认为梅西只是一位靠人造的球王,比如世界杯卡塔尔的表现,靠裁判帮助才获得
1、从公元前5世纪开始,罗马军队在意大利半岛南征北战,经过200年努力,于公元前3世纪征服了意大利。2、接着,为取得地中
本报讯(通讯员闫峰春)阳春三月号角响,砥砺精兵正当时。兴平市公安局交通管理大队认真贯彻落实上级公安机关部署要求,紧盯“学精神、强作风
前总统特朗普即将因掩口费案被提审,据悉他在纽约出庭后,同日将返回佛州,并于当晚发表演说,由于案件性质敏感,特朗普的律师团队估计,主
燕赵都市报纵览新闻记者蔡艳荣、胡邵斐、丁子轩纵览客户端联合全国16家媒体为90位长眠石家庄烈士寻亲的报道引起了全国各地主流媒体和当地退役
工商银行副行长王景武:2022年,全行信贷资金主要投向了重大基础设施项目、战略性新兴产业、绿色金融、消费信贷、优质制造业等领域。各家股份
你们好,最近小活发现有诸多的小伙伴们对于solidworks装配体教程视频,solidworks装配体教程这个问题都颇为
近日券商板块震荡盘整,资金借势加速布局,Wind数据显示,券商ETF(512000)最新单日获资金净申购7337万元,为连续第4日获增仓,期间合计吸金达2 56
专稿:近年来,池州市贵池区坚持严管和厚爱结合、激励和约束并重,以组织有效赋能增强干部担当动能,持续激励干部担当作为,在铸魂固本上深化