13.Selector处理accept和read事件

[TOC]前言多路复用单线程可以配合 Selector 完成对多个 Channel 可读写事件的监控,这称之为多路复用多路复用仅针对网络 IO、普通文件 IO 没法利用多路复用如果不用 Selector 的非阻塞模式,线程大部分时间都在做无用功,而 Selector 能够保证有可连接事件时才去连接有可读事件才去读取有可写事件才去写入限于网络传输能力,Channel 未必时时可写,一旦 Channel 可写,会触发 Selector 的可写事件一、处理accept事件服务器端代码import lombok.extern.slf4j.Slf4j; import java.io.IOExce...

Java 2022-06-02 PM 1219℃ 0条

12.NIO之选择器(Selector)

[TOC]一、概述​ Selector一般称为选择器,也可以翻译为多路复用器,是Java NIO核心组件之一,主要功能是用于检查一个或者多个NIO Channel(通道)的状态是否处于可读、可写。如此可以实现单线程管理多个Channel(通道),当然也可以管理多个网络连接。​ 使用Selector的好处在于,可以使用更少的线程来处理更多的通道,相比使用更多的线程,避免了线程上下文切换带来的开销等。二、Selector(选择器)方法2.1 Selector的创建通过调用静态工厂方法Selector.open()方法创建一个Selector对象。Selector ...

Java 2022-06-01 PM 1309℃ 0条

11.NIO之阻塞模式和非阻塞模式

[TOC]前言SocketChannel方法介绍创建一个服务器对象ServerSocketChannel.open()服务器对象需要绑定ip和端口,使用bind(InetSocketAddress )方法,需要使用传入InetSocketAddress,只需传入一个端口号即可;服务器调用accept()方法获取客户端的连接请求;通过接收到的客户端连接对象read(buffer)方法获取客户端发送的消息。创建客户端SocketChannel.open()客户端使用connect(InetSocketAddress server)方法,连接对应的服务器;通过write(buffer)方法发送...

Java 2022-05-31 PM 1823℃ 0条

10.NIO之Files Demo

[TOC]一、遍历目录文件import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; import java.util.concurrent.atomic.AtomicInteger; /** * @author lilinchao * @date 2022/5/30 * @description 遍历目录,统计文件和文件夹个数 **/ public class FilesTraverseDirectoryDemo { pu...

Java 2022-05-30 PM 1472℃ 0条

09.NIO之Files介绍

[TOC]一、概述Files是Java1.7 在nio中新增的专门用于处理文件和目录的工具类。Files和Path配合可以很方便的完成对文件/目录的创建、读取、修改、删除等操作。二、常用方法介绍2.1 Files.exits()boolean exists(Path path, LinkOption... options)描述:方法检查一个路径是否存在于当前的文件系统中。参数:Path :传入的文件路径。必须LinkOption:exits()方法的选项数组。如LinkOption.NOFOLLOW_LINKS代表不允许跟随文件系统中的符号链接来确定路径是否存在。非必须Path path...

Java 2022-05-30 PM 1731℃ 0条

08.NIO之Path介绍

[TOC]一、Path介绍Path接口是java NIO2的一部分。首次在java 7中引入。Path接口在java.nio.file包下,所以全称是java.nio.file.Path。java中的Path表示文件系统的路径。可以指向文件或文件夹。Path同时也有相对路径和绝对路径之分:绝对路径:表示从文件系统的根路径到文件或是文件夹的路径。相对路径:表示从特定路径下访问指定文件或文件夹的路径。二、Path方法介绍2.1 创建Path实例如果使用java.nio.file.Path实例,必须先创建它。通过Paths.get(String first, String… more)静态工厂...

Java 2022-05-29 PM 1428℃ 0条

07.NIO之FileChannel练习

将数据写入指定文件import lombok.extern.slf4j.Slf4j; import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.charset.StandardCharsets; import java.nio.file.StandardOpenOption; /** * Created by lilinchao * Date 2022/5/27 * Descr...

Java 2022-05-27 PM 1405℃ 0条

06.NIO之FileChannel介绍

[TOC]一、概念FileChannel是一个连接到文件的通道,使用FileChannel可以从文件读数据,也可以向文件中写入数据。Java NIO的FileChannel是标准 Java IO 读写文件的替代方案。FileChannel的主要作用是读取、写入、映射、操作文件。FileChannel 只能工作在阻塞模式下。FileChannel 和 标准Java IO对比FileInputStream/FileOutputStreamFileChannel单向双向面向字节的读写面向Buffer读写不支持支持内存文件映射不支持支持转入或转出其他通道不支持支持文件锁不支持操作文件元信息不支持...

Java 2022-05-27 PM 1716℃ 0条

05.NIO之bytebuffer黏包和半包

[TOC]一、示例网络上有多条数据发送给服务端,数据之间使用 n 进行分隔但由于某种原因这些数据在接收时,被进行了重新组合,例如原始数据有3条为Hello,worldnI'm zhangsannHow are you?n变成了下面的两个 byteBuffer (黏包,半包)Hello,worldnI'm zhangsannHow are you?n分析本来分别将上方三条数据发送给服务端,但是发送到服务的却是两条第一条数据中的第二行和第三行中的Ho当作一条数据发送给了服务端,产生了黏包。第二条数据,因为服务端并未接收到完整的第三条数据,所以产生了半包。二、黏包和半包出现原因黏包发送方在发送...

Java 2022-05-26 PM 1155℃ 0条

04.NIO之bytebuffer常见方法演示

[TOC]1. 分配内存空间可以使用allocate() 和 allocateDirect()方法为ByteBuffer分配空间,其他buffer类也有该方法allocate(): 使用的是java的堆内存,堆内字节缓冲区,读写效率低,会受到GC的影响allocateDirect():使用的是直接内存,直接内存字节缓冲区,读写效率高(零拷贝),不会受GC影响,因为是系统直接内存,所以分配内存要调用操作系统函数,所以分配内存的速度较慢,如果使用不当(资源没得到合理释放),会造成内存泄漏。import java.nio.ByteBuffer; /** * Created by lilin...

Java 2022-05-25 PM 1313℃ 0条