java的NIO编程_环球视讯

来源:腾讯云  发布时间:2023-04-03 18:35:00 

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-04-03 18:35:00

3月国内制造业PMI为51.9% 制造业保持扩张态势

国家统计局日前公布数据显示,3月份,制造业采购经理指数(PMI)为51 9%,比上月下降0 7个百分点,高于临界点,制造业保持扩张态势。更多

2023-04-03 18:02:50

世界微动态丨LOL2023人马怎么出装(打野人马2023

1、详细答案:2、神话可以选择神圣分离者,人马的Q技能后期非常的快,配合神分带来的收益非常的高,第二件可以出魔宗,第一轮更多

2023-04-03 16:53:21

全球热点评!那么问题来了,保房价还是保汇率?|

钛媒体APP「钛赞了」视频周榜第【第90期】3 27-4 2与大家见面了!每周一我们都会根据视频内容、人气、钛(态)度观点、制作质量等...更多

2023-04-03 16:03:37

交警交管科工作总结(热门7篇) 世界快讯

交警交管科工作总结第1篇镇交管办,在市委、市人民政府的正确领导下,在上级部门、镇党委、政府的直接领导下,为深入贯彻落实_《关...更多

2023-04-03 15:06:00

世界讯息:@所有人 这份清明出行提示请查收

清明节假期马上就到了今年清明节是周三4月5日放假,共1天没有调休赏花郊游、祭扫踏青外出游玩、走亲访友……怎么过你安排好了吗?这...更多

2023-04-03 14:44:52

当前通讯!服装搭配技巧女生必看图片_服装搭配技

你们好,最近小活发现有诸多的小伙伴们对于服装搭配技巧女生必看图片,服装搭配技巧女生必看这个问题都颇为感兴趣的,今天小活为更多

2023-04-03 13:42:03

环球今亮点!吉利汽车(00175):极氪3月交付汽车66

智通财经APP讯,吉利汽车(00175)发布公告,集团旗下高端智能电动汽车公司ZEEKRIntelligentTechnologyHoldingLimi更多

2023-04-03 13:07:39

证券板块震荡拉升,东方财富涨超7%_世界时快讯

4月3日上午,证券板块震荡拉升,东方财富涨超7%,指南针、红塔证券、东方证券、中信建投、光大证券等跟涨。更多

2023-04-03 12:13:07

第五届佛山企业“走进清华”活动在北京举行_天天

“我这两年一直在寻找这个技术,这次清华之行让我看到了希望。”在3月30日~31日举行的第五届佛山企业“走进清华”活动中,广东仕诚...更多

2023-04-03 11:31:46