nio

JAVA nio 2 和 Path 类简介

橙三吉。 提交于 2020-01-27 07:44:53
想要初步了解 NIO.2 API,也就是通常所说的“JSR203: More New I/O APIs for the Java Platform”,最好的切入点就是新的抽象类 java.nio.file.Path 类。这个类是 NIO.2 的里程碑,所有应用程序中的 I/O 操作都和这个类密不可分。这个类几乎可以说是 NIO.2 中最常用的类。 Path 类简介 文件路径存在于文件系统中。文件系统可以通过 java.nio.file.FileSystems 这个 final 类来进行访问,从这个类中可以获取 java.nio.file.FileSystem 类的对象。FileSystems 类提供了下面两个很重要的方法,同时也提供了 newFileSystem() 方法,用来创建一个新的文件系统: getDefault():这个静态方法返回 JVM 默认的 FileSystem – 一般说来,也就是操作系统的默认文件系统。 getFileSystem(URI uri):这个静态方法从一组文件系统提供者中返回一个与 URI 匹配的文件系统(FileSystem)。Path 类可以在任何文件系统(FileSystem)和任何存储空间(java.nio.file.FileStore; 这个类反应了底层的存储)上操作文件。默认情况下(最常用),Path 类引用默认文件系统

详解tomcat的连接数与线程池

ぃ、小莉子 提交于 2020-01-27 06:33:36
详解tomcat的连接数与线程池 1、Connector的protocol Connector在处理HTTP请求时,会使用不同的protocol。不同的Tomcat版本支持的protocol不同,其中最典型的protocol包括BIO、NIO和APR(Tomcat7中支持这3种,Tomcat8增加了对NIO2的支持,而到了Tomcat8.5和Tomcat9.0,则去掉了对BIO的支持)。 BIO是Blocking IO,顾名思义是阻塞的IO;NIO是Non-blocking IO,则是非阻塞的IO。而APR是Apache Portable Runtime,是Apache可移植运行库,利用本地库可以实现高可扩展性、高性能;Apr是在Tomcat上运行高并发应用的首选模式,但是需要安装apr、apr-utils、tomcat-native等包。 2、如何指定protocol Connector使用哪种protocol,可以通过元素中的protocol属性进行指定,也可以使用默认值。 指定的protocol取值及对应的协议如下: HTTP/1.1:默认值,使用的协议与Tomcat版本有关 org.apache.coyote.http11.Http11Protocol:BIO org.apache.coyote.http11.Http11NioProtocol:NIO org.apache

Java Nio

≡放荡痞女 提交于 2020-01-27 06:19:04
Java Nio简介 java Nio指的是java在1.4版本后推出的new io,nio的主要特性提升是io操作不再是阻塞的了,通常io我们会分为文件io和网络io,对于文件io操作nio还是阻塞的,但是对于socket的操作则不是阻塞的了。 由于oio(旧io)是阻塞的所以是无法在单线程内实现并发的,只能依赖一个io操作一个线程的方式来实现并发,但是线程的开销对于系统来说是太大了,而nio的实现就可以解决这一问题,nio可以通过单线程管理多个网络连接,并且每一个连接都是非阻塞的,单线程通过判断每个连接的就绪状态来管理并发,这也是IO多路复用的模式。 Java Nio的三大组件 Buffer 缓存区 Channel 通道 Selector 选择器 Buffer buffer是缓存区的意思,就好像是一个容器,用来存储需要io操作的数据,Java Nio一共有8个buffer类型: 分别对应java的四类八种基本数据类型。 Buffer源码分析 四大关键属性 private int mark = - 1 ; // 记录的是position private int position = 0 ; // 当前写或者读的位置 private int limit ; // buffer的最大读写限制 private int capacity ; // 容量 三大关键方法 /** *

Netty学习(一)-为什么选择Netty

流过昼夜 提交于 2020-01-27 04:31:06
前面我们简单学习了NIO。我们知道java的I/O模型一共有四种,分别是:传统的BIO,伪异步I/O,NIO和AIO。为了澄清概念和分清区别,我们还是先简单的介绍一下他们的概念,然后再去比较优劣。以及探讨我们为什么使用netty。 1.概念澄清 1.1 BIO BIO,即Blocking I/O。网络编程的基本模型是Client/Server 模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的Ip 地址和监听端口) ,客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手建立连接,如果连接建在成功,双方就可以通过网络套接字( Socket ) 进行通信。在基于传统同步阻塞模型开发中, ServerSocket 负责绑定IP 地址,启动监听端口:Socket 负责发起连接操作。连接成功之后,双方通过输入和输出流进行 同步阻塞式通信 。 BIO通信模型图: 解释一下上图: 采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成之后,通过输出流返回应答给客户端, 统程销毁。这就是典型的一请求一回答通信模型。 对于这种IO模型我们知道:用户线程发出IO请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态

java使用新的(nio)遍历文件(支持文件后缀名、文件名正则表达式匹配)

老子叫甜甜 提交于 2020-01-27 04:19:55
import org.junit.Test; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; public class TestParseJson { @Test public void test() throws IOException { Path startingDir = Paths.get("f:\\temp"); FindFileVisitor filterFilesVisitor= new FindFileVisitor(".wav","\\d+{13}"); Files.walkFileTree(startingDir, filterFilesVisitor); List<Path> files = filterFilesVisitor.getFilenameList(); System.out.println(files); } } import java.nio.file.FileVisitResult; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor;

Netty序章之BIO NIO AIO演变

扶醉桌前 提交于 2020-01-26 08:31:57
netty是什么     Netty是一个基于Java NIO的client-server网络服务框架,人们可以利用netty快速地开发网络应用。同时netty相对于其他网络框架更加简单并且扩展性更强,这主要得益于其提供的简单易用的api将业务逻辑和网络处理代码解耦开来。能够使你更加专注于业务的实现而不需要太多关心网络底层实现。 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发 高性能 、 高可靠 的网络服务器和客户端程序。Netty简化了网络程序的开发,是很多框架和公司都在使用的技术。更是面试的加分项。Netty并非横空出世,它是在BIO,NIO,AIO演变中的产物,是一种NIO框架。而BIO,NIO,AIO更是笔试中要考,面试中要问的技术。也是一个很好的加分项 流程图: 技术:BIO,NIO,AIO 说明:github上有更全的源码。 源码: https://github.com/ITDragonBl... BIO BIO 全称Block-IO 是一种 阻塞同步 的通信模式。我们常说的Stock IO 一般指的是BIO。是一个比较传统的通信方式, 模式简单 , 使用方便 。但 并发处理能力低 , 通信耗时 , 依赖网速 。 BIO 设计原理: 服务器通过一个Acceptor线程负责监听客户端请求和为每个客户端创建一个新的线程进行链路处理。典型的一请求一应答模式

NIO之分散与聚集

≡放荡痞女 提交于 2020-01-26 01:03:27
分散和聚集的理解 分散读取 是指从Channel中读取的数据“分散”到多个buffer中 注:按照缓冲区的顺序,从Channel中读取的数据依次将buffer填满 代码实现如下 1 @Test 2 public void test5 () throws Exception { 3 RandomAccessFile rw = new RandomAccessFile( "src/test/java/1.txt" , "rw" ); 4 5 // 获取通道 6 FileChannel channel = rw.getChannel(); 7 8 // 分配指定大小的缓冲区 9 ByteBuffer buf1 = ByteBuffer.allocate( 100 ); 10 ByteBuffer buf2 = ByteBuffer.allocate( 1024 ); 11 12 // 分散读取 13 ByteBuffer[] bufs = {buf1, buf2}; 14 channel.read(bufs); 15 16 // 切换为读模式 17 for (ByteBuffer byteBuffer : bufs) { 18 byteBuffer.flip(); 19 } 20 21 System.out.println( new String(bufs[ 0 ].array(), 0

使用netty手撸一个简易http服务器

青春壹個敷衍的年華 提交于 2020-01-25 17:47:20
文章目录 netty概述 netty架构模型 手撸一个http服务器 pom.xml引入netty 编写netty服务端 运行测试 小结 netty概述   netty是基于java NIO封装的一款网络编程框架,可以帮助我们便捷,快速的开发网络应用程序,例如有名的dubbo框架就是基于netty实现的RPC远程服务调用。netty封装了NIO大部分的底层操作,所以需要我们对NIO有一定的了解才能更好的掌握netty框架。   java NIO采用的是同步非阻塞技术,与传统的BIO(同步阻塞)相比,能够处理更多的请求并且更好的利用CPU的资源(一个线程可以处理多个请求,而BIO一个线程只能处理一个)。同步阻塞:你去剪头发,一直站在边上等着理发师把之前的顾客头发剪完并且不做任何事情,同步非阻塞:你去剪头发,先做着自己的事情时不时回来看一下是否轮到自己。   到jdk1.7的时候,AIO技术出现,也称NIO2,它是异步非阻塞的:打电话告诉理发师自己要剪头发,然后在家里做自己的事情,理发师忙完上门剪头发。听起来这十分美好,但是令人遗憾的是它并没有得到广泛的应用,原因是读写操作交给了操作系统处理,处理速度很大程度上会依赖操作系统的稳定以及内核的优劣,所以NIO依然是主流。而netty正是根据NIO实现的一款优秀的网络编程框架。   有人会问,既然有了NIO,为什么还需要netty

【Java TCP/IP Socket】基于NIO的TCP通信(含代码)

青春壹個敷衍的年華 提交于 2020-01-25 10:50:59
NIO主要原理及使用 NIO采取通道(Channel)和缓冲区(Buffer)来传输和保存数据,它是非阻塞式的I/O,即在等待连接、读写数据(这些都是在一线程以客户端的程序中会阻塞线程的操作)的时候,程序也可以做其他事情,以实现线程的异步操作。 考虑一个即时消息服务器,可能有上千个客户端同时连接到服务器,但是在任何时刻只有非常少量的消息需要读取和分发(如果采用线程池或者一线程一客户端方式,则会非常浪费资源),这就需要一种方法能阻塞等待,直到有一个信道可以进行I/O操作。NIO的Selector选择器就实现了这样的功能,一个Selector实例可以同时检查一组信道的I/O状态,它就 类似一个观察者,只要我们把需要探知的SocketChannel告诉Selector,我们接着做别的事情,当有事件(比如,连接打开、数据到达等)发生时,它会通知我们,传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的SocketChannel,然后,我们从这个Channel中读取数据,接着我们可以处理这些数据。 Selector内部原理实际是在做一个对所注册的Channel的轮询访问,不断的轮询(目前就这一个算法),一旦轮询到一个Channel有所注册的事情发生,比如数据来了,它就会读取Channel中的数据,并对其进行处理。 要使用选择器,需要创建一个Selector实例

BIO,NIO与AIO的区别

泪湿孤枕 提交于 2020-01-25 10:12:27
要说清这几种IO的区别,首先必须辨析清楚同步与异步,阻塞与非阻塞的区别。 一:同步与异步 同步和异步关注的是 消息通信机制 (synchronous communication/ asynchronous communication) 所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。 换句话说,就是由*调用者*主动等待这个*调用*的结果。 而异步则是相反, *调用*在发出之后,这个调用就直接返回了,所以没有返回结果 。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。 典型的异步编程模型比如Node.js 举个通俗的例子: 你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。 而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。 二:阻塞与非阻塞 阻塞和非阻塞关注的是 程序在等待调用结果(消息,返回值)时的状态. 阻塞调用是指调用结果返回之前,当前线程会被挂起