《面试1v1》JavaNIO

news2024/11/18 23:01:08

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。

面试官: 你好,我想问一下你对 Java NIO 的了解。

候选人: 当然,Java NIO 是 Java 的一种 I/O 模型,它提供了一种基于缓冲区和通道的 I/O 操作方式。相比传统的 I/O 模型,Java NIO 具有更高的性能和更好的扩展性。

面试官: 那你能具体说一下 Java NIO 的特点吗?

候选人: 当然可以。Java NIO 的特点主要有以下几点:

  1. 非阻塞式 I/O:Java NIO 支持非阻塞式 I/O 操作,可以在等待 I/O 操作完成的同时,继续执行其他任务,从而提高系统的并发性能。

  2. 缓冲区:Java NIO 使用缓冲区来处理数据,可以提高数据的读写效率,并且可以支持随机访问。

  3. 通道:Java NIO 使用通道来进行数据的读写操作,通道可以支持双向数据传输,并且可以在不同的线程之间共享。

  4. 选择器:Java NIO 提供了选择器来实现多路复用,可以同时监控多个通道的 I/O 事件,从而提高系统的并发性能。

面试官: 那你能说一下 Java NIO 的应用场景吗?

候选人: 当然可以。Java NIO 的应用场景非常广泛,包括网络编程、文件操作、内存映射等。例如,在网络编程中,Java NIO 可以实现高性能的服务器和客户端,可以支持大量的并发连接,并且可以使用选择器来实现多路复用。在文件操作中,Java NIO 可以实现高效的文件读写操作,可以使用内存映射来提高文件的读取速度。在内存映射中,Java NIO 可以将文件映射到内存中,从而可以直接访问文件的内容,而无需进行繁琐的读写操作。

面试官: 那你能说一下 Java NIO 的核心组件吗?

候选人: 当然可以。Java NIO 的核心组件包括缓冲区(Buffer)、通道(Channel)、选择器(Selector)和字节编解码器(Charset)。缓冲区用于存储数据,通道用于进行数据的读写操作,选择器用于实现多路复用,字节编解码器用于将字节流转换为字符流。这些组件共同构成了 Java NIO 的基础架构,可以支持高效的 I/O 操作。

面试官: 那你能给我举个例子,说明 Java NIO 在实际开发中的应用吗?

候选人: 当然可以。在一个聊天室应用中,可以使用 Java NIO 来实现多个客户端之间的通信。每个客户端都可以使用一个通道来进行数据的读写操作,而服务器可以使用一个选择器来监控所有的通道,从而实现多路复用。这样可以大大提高服务器的并发性能,支持大量的并发连接。

以下是一个简单的示例代码,用于实现一个简单的聊天室应用:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;

public class ChatRoomServer {
    private static final int PORT = 8888;
    private static final int BUFFER_SIZE = 1024;
    private static final String CHARSET = "UTF-8";

    public static void main(String[] args) throws IOException {
        // 创建一个选择器
        Selector selector = Selector.open();

        // 创建一个服务器通道,并绑定到指定的端口
        ServerSocketChannel serverChannel = ServerSocketChannel.open();
        serverChannel.socket().bind(new InetSocketAddress(PORT));
        serverChannel.configureBlocking(false);

        // 将服务器通道注册到选择器上,并监听连接事件
        serverChannel.register(selector, SelectionKey.OP_ACCEPT);

        System.out.println("Server started on port " + PORT);

        while (true) {
            // 阻塞等待事件发生
            selector.select();

            // 获取所有已经就绪的事件
            Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();

            while (iterator.hasNext()) {
                SelectionKey key = iterator.next();
                iterator.remove();

                if (key.isAcceptable()) {
                    // 处理连接事件
                    ServerSocketChannel channel = (ServerSocketChannel) key.channel();
                    SocketChannel clientChannel = channel.accept();
                    clientChannel.configureBlocking(false);
                    clientChannel.register(selector, SelectionKey.OP_READ);
                    System.out.println("Client connected: " + clientChannel.getRemoteAddress());
                } else if (key.isReadable()) {
                    // 处理读事件
                    SocketChannel channel = (SocketChannel) key.channel();
                    ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
                    int len = channel.read(buffer);
                    if (len > 0) {
                        buffer.flip();
                        String message = new String(buffer.array(), 0, len, CHARSET);
                        System.out.println("Received message: " + message);
                        broadcast(selector, channel, message);
                    } else if (len == -1) {
                        channel.close();
                    }
                }
            }
        }
    }

    private static void broadcast(Selector selector, SocketChannel sender, String message) throws IOException {
        for (SelectionKey key : selector.keys()) {
            if (key.isValid() && key.channel() instanceof SocketChannel) {
                SocketChannel channel = (SocketChannel) key.channel();
                if (!channel.equals(sender)) {
                    ByteBuffer buffer = ByteBuffer.wrap(message.getBytes(CHARSET));
                    channel.write(buffer);
                }
            }
        }
    }
}

这个示例代码实现了一个简单的聊天室应用,使用 Java NIO 来实现多个客户端之间的通信。每个客户端都可以使用一个通道来进行数据的读写操作,而服务器可以使用一个选择器来监控所有的通道,从而实现多路复用。这样可以大大提高服务器的并发性能,支持大量的并发连接。

面试官: 代码写的很好,下次带笔记本过来。

最近我在更新《面试1v1》系列文章,主要以场景化的方式,讲解我们在面试中遇到的问题,致力于让每一位工程师拿到自己心仪的offer,感兴趣可以关注JavaPub追更!

🎁目录合集:

Gitee:https://gitee.com/rodert/JavaPub

GitHub:https://github.com/Rodert/JavaPub

http://javapub.net.cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/541706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MapReduce【自定义分区Partitioner】

实际开发中我们可能根据需求需要将MapReduce的运行结果生成多个不同的文件&#xff0c;比如上一个案例【MapReduce计算广州2022年每月最高温度】&#xff0c;我们需要将前半年和后半年的数据分开写到两个文件中。 默认分区 默认MapReduce只能写出一个文件&#xff1a; 因为我…

「OceanBase 4.1 体验」OceanBase:解读领先的分布式数据库系统,功能与体验全解析

文章目录 前言一、关于 【OceanBase 4.1】征文活动&#xff08;可跳过&#xff09;二、OceanBase 产品了解2.1 初识 OceanBase2.2 什么是 OceanBase2.3 OceanBase 相关链接2.4 OceanBase 与传统数据库对比有何特别之处2.5 OceanBase 相关概念以及术语2.5.1 OceanBase 基本概念2…

接口测试总结及其用例设计方法整理,希望可以帮到你

目录 接口测试的总结文档 第一部分&#xff1a; 第二部分&#xff1a; 接口测试用例设计 接口测试的总结文档 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做…

ios中video标签兼容问题

案例 这是在实际开发中遇到的问题,产品给出的效果图如下: 其实就是一个h5页面中有很多视频, 但是我为什么都画着预览图呢? 因为在ios中video标签中尽管有src属性, 但是在没有预览图的情况下, 是一个灰蒙蒙的图层的, 很丑, 效果如下: 看到这里是不是很崩溃, 在PC端, 在安卓端…

RK3568平台开发系列讲解(Camera篇)快速了解RK Camera的使用

🚀返回专栏总目录 文章目录 一、MIPI CSI1.1 Full Mode特点1.2 Split Mode特点二、Full Mode配置2.1 配置sensor端2.2 csi2_dphy0相关配置2.3 isp相关配置三、Split Mode配置3.1 配置sensor端3.2 csi2_dphy1/csi2_dphy2相关配置3.3 isp相关配置四、软件相关目录

自然语言处理实战项目7-利用层次聚类方法做文本的排重,从大量的文本中找出相似文本

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理实战项目7-利用层次聚类方法做文本的排重&#xff0c;从大量的文本中找出相似文本。随着互联网技术的不断发展&#xff0c;越来越多的数据被广泛地应用在各个领域中。而文本数据是其中之一&#xff0c;…

ar在汽车维修行业的应用场景

由于AR增强现实技术的易用性&#xff0c;在汽车产业链中&#xff0c;已处处可见AR技术的踪影&#xff0c;像汽车设计AR远程协同&#xff0c;汽车装配AR远程指导&#xff0c;汽车维修AR远程协助等等&#xff0c;那么下面为详细介绍AR增强现实技术在汽车制造领域的应用。 环境/物…

实力在线 | 赛宁网安连续三年入选《中国网络安全市场全景图》

​​近日&#xff0c;国内专业安全机构数说安全正式发布了《2023年中国网络安全市场全景图》&#xff08;以下简称全景图&#xff09;。此次全景图分类架构涵盖了产品、解决方案、应用场景、服务4个维度&#xff0c;覆盖了目前我国网络安全行业所有成熟的细分市场。 赛宁网安凭…

Postman实现数字签名,Session依赖, 接口依赖, 异步接口结果轮询

Script(JS)为Postman赋予无限可能 基于Postman 6.1.4 Mac Native版 演示结合user_api_demo实现 PS 最近接到任务, 要把几种基本下单接口调试和持续集成一下, 做个常规功能验证, 研究了下发现, 不同的下单途径, 有的需要登录(Session依赖), 有的需要验签(使用数字签名的微服务),…

用本地机做跳板使服务器连接外网【mac】

用自己的电脑做跳板使服务器连接外网 前提整体流程连接服务器配置服务器配置自己的电脑 前提 很多时候我们的服务器只能联内网&#xff0c;但是没法登外网&#xff0c;这样pip&#xff0c;conda 啥的都没法用&#xff0c;很麻烦。 一个简单的解决方法就是用自己的电脑作为跳板…

补充点【数据分析统计学知识点】

数据分析所需的统计学笔记 0.数据分析师拿到数据 第一利器&#xff1a;描述性统计信息 第二利器&#xff1a;对比分析法 第三利器&#xff1a;指标体系-要素拆解&#xff0c;维度拆解 第四利器&#xff1a;相关分析 第五利器&#xff1a;趋势预测 1.均值 2.中位数 3.众数…

基于Java+SpringBoot+vue的口腔管家平台设计与实现

博主介绍&#xff1a;擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例…

Hadoop 3.0.0的集群搭建和Hive 3.1.3的安装

Hi,朋友们&#xff0c;我们又见面了&#xff0c;这一次我给大家带来的是Hadoop集群搭建及Hive的安装。 说明一下&#xff0c;网上有很多的教程&#xff0c;为什么我还要水&#xff1f; 第一&#xff0c;大多数的安装都是很顺利的&#xff0c;没有疑难解答。 第二&#xff0c…

分布式项目08 redis的扩容,预备redis宕机的哨兵处理 和 最后集大成redis集群

01.redis扩容 由于redis的容量也是有限的&#xff0c;所以&#xff0c;就会有扩容的操作。也就好像内存中扩容一样。redis有分片这种说法&#xff0c;具体实现操作如下&#xff1a; 第一步&#xff1a;首先在/usr/local/src中去找到redis文件夹。cd /usr/local/src 而后进入re…

瑞吉外卖 - 菜品信息分页查询功能(17)

某马瑞吉外卖单体架构项目完整开发文档&#xff0c;基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成&#xff0c;有需要的胖友记得一键三连&#xff0c;关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料&#xff1a;https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

开源大语言模型完整列表

Large Language Model (LLM) 即大规模语言模型&#xff0c;是一种基于深度学习的自然语言处理模型&#xff0c;它能够学习到自然语言的语法和语义&#xff0c;从而可以生成人类可读的文本。 LLM 通常基于神经网络模型&#xff0c;使用大规模的语料库进行训练&#xff0c;比如使…

【Linux进阶之路】基本指令(下)

文章目录 一. 日志 date指令——查看日期基本语法1基本语法2cal指令——查看日历常见选项 二 .find——查找文件常用选项-name显示所有文件显示指定类型的文件 三.grep——行文本过滤工具语法常见的用法补充知识——APP与服务器的联系 四.打包压缩与解压解包zip与unzipzipunzip…

又一高速AD/DA数据采集卡问世,何不了解一下?

FMC190 子卡集成 2 通道 3Gsps 采样率&#xff0c;14 位 AD&#xff0c;2 通道12.8Gsps 16 位DA。板载时钟芯片 HMC7044&#xff0c;可以提供JESD204B所需要的各种时钟。具有同步/触发功能&#xff0c;模拟信号采用 SSMA 射频连接器输入和输出。板载时钟芯片为 HMC7044&#xf…

Unity UI -- (3)管理屏幕大小和锚点

在前面我们探索了一些基本的文本格式。我们需要考虑一个问题&#xff0c;这个文本在屏幕大小发生变化时该如何适应呢&#xff1f; 在Unity中&#xff0c;我们可以使用Canvas和Anchor Point&#xff08;锚点&#xff09;系统来确保UI元素总是出现在正确的位置&#xff0c;不管它…

Arduino ESP32的串口

Arduino的ESP32的三个串口 ESP32的三个串口 在Arduino的核心中有三个串口&#xff0c;分别是Serial&#xff0c;Serial1&#xff0c;和Serial2. 当然ESP32也可以使用软串口。但硬件串口更稳健&#xff08;我这样理解&#xff09;。但Serial1这个串口不能使用&#xff0c;因为…