Java NIO
Master.TJ
https://github.com/fengruotj
展开
-
NIO详解(四):NIO编程
1. NIO类库简介1.1 缓冲区BufferBuffer是一个对象,它包含了一些要写入或者要读出的数据。在NIO类库中加入Buffer对象,体现了新库和原来I/O的一个重要区别。在NIO库中,所有的数据都是用缓冲区处理的。在读取数据时,它是直接读取到缓冲区中的;在写入到缓冲区时。任何时候访问NIO中的数据,都是通过缓冲区进行操作。缓冲区实质上是一个数组。通常它是一个字节数据(ByteBuf...原创 2019-05-20 11:44:29 · 648 阅读 · 1 评论 -
NIO详解(十二):AsynchronousFileChannel详解
1. 概述Java NIO中的FileChannel是一个连接到文件的通道。可以通过文件通道读写文件。FileChannel无法设置为非阻塞模式,他总是运行在阻塞模式下。在Java 7中,AsynchronousFileChannel被添加到Java NIO。AsynchronousFileChannel使读取数据,并异步地将数据写入文件成为可能。2. 创建一个AsynchronousFile...原创 2019-05-20 19:17:00 · 3058 阅读 · 4 评论 -
NIO详解(十一):线程间通信管道Pipe
1. 概述Java NIO 管道是2个线程之间的单向数据连接。Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取。下面是Pipe原理的图示:当有两个线程ThreadA和ThreadB需要进行线程间通信时,ThreadA可以通过SinkChannel向Pipe中写入数据。ThreadB可以通过SourceChannel从Pipe中读取数据。2....原创 2019-05-20 18:45:18 · 1092 阅读 · 0 评论 -
NIO详解(二): BIO 浅谈 同步 异步与阻塞 非阻塞
在我们了解Java NIO/BIO的网络通信之前,我们先了解一下常用的阻塞/非阻塞模型以及同步/异步的概念一、阻塞和非阻塞从简单的开始,我们以经典的读取文件的模型举例。(对操作系统而言,所有的输入输出设备都被抽象成文件。)在发起读取文件的请求时,应用层会调用系统内核的I/O接口。如果应用层调用的是阻塞型I/O,那么在调用之后,应用层即刻被挂起,一直出于等待数据返回的状态,直到系统内核从...原创 2018-11-07 21:19:44 · 6268 阅读 · 5 评论 -
NIO详解(一):java网络编程IO总结(BIO、NIO、AIO)
1.基本概念在Java网络通信中,最基本的概念就是Socket编程了。Socket又称“套接字” 向网络发出请求或者应答网络请求。Socket 和ServerSocket类库位于 Java.net 包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Scoket实例,操作这个实例,完成所需要的会话。对于一个网络连接来说,套接字是...原创 2019-01-09 16:42:17 · 1375 阅读 · 1 评论 -
NIO详解(三):IO多路复用模型之select、poll、epoll
1. 前言最近在研究基于Java的高性能异步非阻塞I/O框架Netty,因为最近做的RDMAChannel要用到其中的思想。Netty底层是通过大量的NIO实现的,通过分析底层NIO源码,发现NIO底层调用的是poll系统调用。所以本博客就来细谈select、poll、epoll系统调用。2. NIO Selector底层源码分析protected int doSelect(long tim...原创 2019-04-02 11:34:30 · 2539 阅读 · 0 评论 -
NIO详解(九):Selector详解
1. 概述Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。在I/O编程中,当需要同时处理多个客户端接入请求的时候,可以利用多线程或者I/O多路复用技术来进行处理。I/O多路复用技术是通过I/O的阻塞复用到同一个select的阻塞上,从而使得系统在单线程...原创 2019-05-20 17:00:39 · 1019 阅读 · 0 评论 -
NIO详解(九):Channel详解
1. Channel概述Java NIO的通道类似流,但又有些不同。Channel既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。Channel通道可以异步地读写。Channel通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。1.1 Channel ...原创 2019-05-20 16:28:56 · 2133 阅读 · 0 评论 -
NIO详解(五):Buffer详解
1. 概述Java NIO中的Buffer用于和NIO通道进行交互。如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的。缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。ByteBuffer是NIO里用得最多的Buffer,它包含两个实现方式:HeapByteBuffer是基于Java堆的实现...原创 2019-05-20 15:35:32 · 957 阅读 · 0 评论 -
NIO详解(七):进程间通信(MappedByteBuffer)
1. 前言最近在研究Java进程间通信,为了了解Java中的SharedMemory共享内存。我特地去研究了一些Java NIO进程间通信的方式。2. Java NIO MappedByteBuffer原理传统的进程间通信的方式有大致如下几种:(1) 管道(PIPE)(2) 命名管道(FIFO)(3) 信号量(Semphore)(4) 消息队列(MessageQu...原创 2019-03-07 12:11:02 · 1159 阅读 · 0 评论 -
NIO详解(六):Java堆外内存
1. 前言最近研究ByteBuffer和DirectByteBuffer。堆外内存是相对于堆内内存的一个概念。堆内内存是由JVM所管控的Java进程内存,我们平时在Java中创建的对象都处于堆内内存中,并且它们遵循JVM的内存管理机制,JVM会采用垃圾回收机制统一管理它们的内存。那么堆外内存就是存在于JVM管控之外的一块内存区域,因此它是不受JVM的管控。下面本博客就来详细介绍以下Java NI...原创 2019-03-20 21:52:30 · 7077 阅读 · 9 评论 -
NIO详解(十):FileChannel零拷贝技术
1.前言前面我们谈到了Java NIO的众多技术脉络。下面我们来说一下Java NIO的技术核心:零拷贝技术,Kafka就是采用Java NIO零拷贝技术提升文件读取性能。2. JavaNIO中的零拷贝2.1 NIO中内存映射方式I/O首先要说明的是,JavaNIO中的Channel(通道)就相当于操作系统中的内核缓冲区,有可能是读缓冲区,也有可能是网络缓冲区,而Buffer就相当于操作系...原创 2019-03-20 22:02:33 · 3596 阅读 · 4 评论 -
NIO详解(十三):Java IO 和NIO 总结
1. 概述下面总结了Java NIO和IO之间的主要差别IONIO面向流面向缓冲阻塞IO非阻塞IO无选择器2. Java IO和 NIO的主要区别2.1 面向流和面向缓冲区Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 JJava IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被...原创 2019-05-20 19:48:03 · 1712 阅读 · 0 评论