nio

详解 Paths类 与 Files类

寵の児 提交于 2020-03-05 11:34:35
目录 Path接口 Files类 部分API使用展示 在本篇博文中,本人主要讲解NIO 的两个核心点 —— 缓冲区(Buffer) 和 通道 (Channel)之一的 缓冲区(Buffer), 有关NIO流的其他知识点请观看本人博文 《详解 NIO流》 @ Path接口 概念 : java.nio.file.Path 接口代表一个平台无关的平台路径,描述了 目录结构中文件的位置 。 对象的获取手段 : Paths 提供的get()方法用来获取Path对象: Path get(String first,String… more): 用于将多个字符串串连成路径 常用API : boolean endsWith(String path) : 判断是否以 path 路径结束 boolean startsWith(String path) : 判断是否以 path 路径开始 boolean isAbsolute() : 判断是否是绝对路径 Path getFileName() : 返回与调用 Path 对象关联的文件名 Path getName(int idx) : 返回的指定索引位置 idx 的路径名称 int getNameCount() : 返回 Path 根目录后面元素的数量 Path getParent() : 返回 Path 对象包含整个路径,不包含 Path 对象指定的文件路径

Java NIO 底层原理

旧城冷巷雨未停 提交于 2020-03-05 10:06:43
目录 1.1. Java IO读写原理 1.1.1. 内核缓冲与进程缓冲区 1.1.2. java IO读写的底层流程 1.2. 四种主要的IO模型 1.3. 同步阻塞IO(Blocking IO) 1.4. 同步非阻塞NIO(None Blocking IO) 1.5. IO多路复用模型(I/O multiplexing) 1.6. 异步IO模型(asynchronous IO) 小结一下: 本文的知识,在《 Netty Zookeeper Redis 高并发实战 》 1.1. Java IO读写原理 无论是Socket的读写还是文件的读写,在Java层面的应用开发或者是linux系统底层开发,都属于输入input和输出output的处理,简称为IO读写。在原理上和处理流程上,都是一致的。区别在于参数的不同。 用户程序进行IO的读写,基本上会用到read&write两大系统调用。可能不同操作系统,名称不完全一样,但是功能是一样的。 先强调一个基础知识:read系统调用,并不是把数据直接从物理设备,读数据到内存。write系统调用,也不是直接把数据,写入到物理设备。 read系统调用,是把数据从内核缓冲区复制到进程缓冲区;而write系统调用,是把数据从进程缓冲区复制到内核缓冲区。这个两个系统调用,都不负责数据在内核缓冲区和磁盘之间的交换。底层的读写交换

高性能Server---Reactor模型

£可爱£侵袭症+ 提交于 2020-03-05 05:30:14
高性能Server---Reactor模型 原文地址: http://www.ivaneye.com/2016/07/23/iomodel.html 无处不在的C/S架构 在这个充斥着云的时代,我们使用的软件可以说99%都是C/S架构的! 你发邮件用的Outlook,Foxmail等 你看视频用的优酷,土豆等 你写文档用的Office365,googleDoc,Evernote等 你浏览网页用的IE,Chrome等(B/S是特殊的C/S) ...... C/S架构的软件带来的一个明显的好处就是:只要有网络,你可以在任何地方干同一件事。 例如:你在家里使用Office365编写了文档。到了公司,只要打开编辑地址就可以看到在家里编写的文档,进行展示或者继续编辑。甚至在手机上进行阅读与编辑。不再需要U盘拷来拷去了。 C/S架构可以抽象为如下模型: C就是Client(客户端),上面的B是Browser(浏览器) S就是Server(服务器): 服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服务 C/S架构之所以能够流行的一个主要原因就是网速的提高以及费用的降低,特别是无线网络速度的提高。试想在2G时代,大家最多就是看看文字网页,小说什么的。看图片,那简直就是奢侈!更别说看视频了! 网速的提高,使得越来越多的人使用网络,例如:优酷,微信都是上亿用户量

Cannot construct instance of `com.*` (although at least one Creator exists): cannot deserializ

北慕城南 提交于 2020-03-04 05:13:16
今天开发的springboot项目的时候,当前端发出请求的时候,还没有进入controller层就爆出了这样的一个错误。 Cannot construct instance of ` com.***.*** ` ( although at least one Creator exists ) : cannot deserialize from Object value ( no delegate- or property-based Creator ) ; nested exception is 这让我感觉到甚是奇怪,也不指明第几行,只说说不能序列化,找了半天错误才在一篇文章中找到说是因为没有构造函数,让我恍然大悟,因为之前也犯过类似的错误。经过仔细排序,后来发现是因为在请求的实体中使用了@Builder注解,而使用使用这个注解的时候,必须搭配@AllArgsConstructor 和@NoArgsConstructor两个注解,代表全参数构造和无参数构造。而我却没有。 2020-03-02 18:55:33.527 DEBUG [ 3d98341f4128baad ] 10 --- [ http-nio-30510-exec-3 ] druid.sql.Statement - { conn-10012, stmt-20350, rs-50969 } query executed.

NIO中Buffer缓冲区的实现

不问归期 提交于 2020-03-03 23:28:10
Buffer 缓冲区 Java的NIO中Buffer至关重要:buffer是读写的中介,主要和NIO的通道交互。数据是通过通道读入缓冲区和从缓冲区写入通道的。 其实缓冲区buffer的本质就是一块可以读写的内存块。这块内存块被包装成NIO的Buffer对象,并提供了一组方法方便读写。 3.1 Buffer的基本用法: 使用Buffer读写数据一般是下面步骤: 1. 写入数据到Buffer 2. 调用flip()方法:Buffer从写模式切换到读模式。 3. 从buffer读取数据 4. 调用clear()方法或则compact()方法。 当向buffer写入数据时,buffer会记录下写了多少数据。一旦要读取数据,需要通过flip()方法将Buffer从写模式切换到读模式。在读模式下,可以读取之前写入到buffer的所有数据。 一旦读完了所有的数据,就需要清空缓冲区,让它可以再次被写入。有两种方式能清空缓冲区:调用clear()或compact()方法。clear()方法会清空整个缓冲区。compact()方法只会清除已经读过的数据。任何未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。 下面是一个简单的示例: 1 RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw")

java--BIO、NIO、AIO

独自空忆成欢 提交于 2020-03-03 18:23:13
java 的IO是什么? Java程序中,对于数据的输入/输出操作 都是以“流”的方式进行的,java io就是用来进行数据的操作的。 JAVA IO 的三种类型 同步阻塞的BIO 同步非阻塞的NIO 异步非阻塞的AIO 同步 : 使用同步IO时,Java自己处理IO读写。 异步 :使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS,OS需要支持异步IO操作API。 阻塞 :使用阻塞IO时,Java调用会一直阻塞到读写完成才返回。 非阻塞 : 使用非阻塞IO时,如果不能读写Java调用会马上返回,当IO事件分发器会通知可读写时再继续进行读写,不断循环直到读写完成。 1.BIO(同步阻塞) 当对一个数据源进行IO操作时,其他操作流都不能对这个数据源进行操作,必须等操作完,其他操作流才能对该数据进行操作。 为什么是同步阻塞? 它其实就是服务端创建一个ServerSocket, 然后就是客户端用一个Socket去连接服务端的那个ServerSocket, ServerSocket接收到了一个的连接请求就创建一个Socket和一个线程去跟那个Socket进行通讯。接着客户端和服务端就进行阻塞式的通信,客户端发送一个请求,服务端Socket进行处理后返回响应。 每次一个客户端接入,都需要在服务端创建一个线程来服务这个客户端 (1)字节流 读取单个字节

NIO-EPollSelectorIpml源码分析

十年热恋 提交于 2020-03-02 14:26:21
目录 NIO-EPollSelectorIpml源码分析 目录 前言 初始化EPollSelectorProvider 创建EPollSelectorImpl EPollSelectorImpl结构 fdToKey 管道文件描述符 EPollArrayWrapper 注册 doSelect 关闭EpollSelectorImpl 总结 相关文献 NIO-EPollSelectorIpml源码分析 目录 NIO-概览 NIO-Buffer NIO-Channel NIO-Channel接口分析 NIO-SocketChannel源码分析 NIO-FileChannel源码分析 NIO-Selector源码分析 NIO-WindowsSelectorImpl源码分析 NIO-EPollSelectorIpml源码分析 前言 本来是想学习Netty的,但是Netty是一个NIO框架,因此在学习netty之前,还是先梳理一下NIO的知识。通过剖析 源码 理解NIO的设计原理。 本系列文章针对的是JDK1.8.0.161的源码。 NIO-Selector源码分析 对 Selector 的功能和创建过程进行了分析,本篇对Linux环境下JDK实现的 EPollSelectorImpl 源码进行详细讲解。 本篇文章不会对EPoll算法进行详细介绍,对epoll算法感兴趣或还不了解的同学可以看

简述NIO,BIO的区别

大兔子大兔子 提交于 2020-03-01 20:16:37
BIO就是我们传统意义上的Inputstream,Outputstream。这个东西是同步阻塞的,效率不高,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。 NIO 随着分布式的如火如荼,为了提高访问效率,引进了NIO,同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器selector上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。 同时这个东西读取或者写出数据的时候不是直接操作channel的,他是操作buffer内存的。这个东西写起来很麻烦,从而诞生了Netty来封装NIO,像一些市面上牛逼的中间件用的都是这东西。比如zk.dubbo等等。。。。 好了说了这么多上代码吧,这东西到底是咋玩的呢? ////////BIO代码服务端和客户端 public class BIOClient { public static void main(String[] args) throws UnknownHostException, IOException { //要和谁进行通信,服务器IP、服务器的端口 //一台机器的端口号是有限 Socket client = new Socket("localhost", 8080

netty—入门(二)—NIO(1)

非 Y 不嫁゛ 提交于 2020-03-01 12:06:38
NIO入门 1、理论知识 一个线程从某个通道(一个线程可以管理多个通道)发送请求或者读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可以使用,那么就什么都不会获取, 而不是保持线程阻塞 ,所以直至数据变得可以读取之前,该线程就可以继续做其他的事情。 2、案例 完整代码: public class BasicBuffer { public static void main ( String [ ] args ) { //创建一个buffer 大小为5 5个int(不同的类型对应不同的buffer,int char 等,不同的类型对应不同的等级,不同的数据放在不同的buffer里面,提高效率) IntBuffer intBuffer = IntBuffer . allocate ( 5 ) ; //向bufffer中纺织数据 for ( int i = 0 ; i < intBuffer . capacity ( ) ; i ++ ) { intBuffer . put ( i * 2 ) ; } //将bufer转换,读写转换(!!!!) intBuffer . flip ( ) ; while ( intBuffer . hasRemaining ( ) ) { //每次get之后就往后移动一次 System . out . println ( intBuffer .

Reactor模型的Java NIO实现

一曲冷凌霜 提交于 2020-03-01 12:02:24
实现Reactor模型可分为以下三种: 单线程模型 单Reactor多线程模型 主从Reactor多线程模型。 单线程模型 Reactor单线程模型,指的是所有的IO操作都在同一个线程上面完成,线程的职责如下: 作为NIO服务端,接收客户端的TCP连接; 作为NIO客户端,向服务端发起TCP连接; 读取通信对端的请求或者应答消息; 向通信对端发送消息请求或者应答消息。 由于Reactor模式使用的是异步非阻塞IO,所有的IO操作都不会导致阻塞,理论上一个线程可以独立处理所有IO相关的操作。从架构层面看,一个NIO线程确实可以完成其承担的职责。例如,通过Acceptor接收客户端的TCP连接请求消息,链路建立成功之后,通过Dispatch将对应的ByteBuffer派发到指定的Handler上进行消息解码。用户线程可以通过消息编码通过NIO线程将消息发送给客户端。 Server端 public class Reactor1 { public static void main(String[] args) throws IOException { Selector selector = Selector.open(); ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();