
Java IO NIO
从基础触发,向Netty冲冲冲
保暖大裤衩LeoLee
芜湖~~~
展开
-
Netty设计思想:详解《Scalable IO in Java》,认识Reactor模式
Scalable IO in JavaDoug Lea编写的一篇关于Java NIO以及Reactor模式的经典文章原文已经上传在线文档:【腾讯文档】Scalable_IO_in_Java 为了更好的理解本文章,请参阅我的列一篇文章:Java NIO:在网络编程中的基本范式同时也可以关注我的相关专栏,谢谢大伙啦!!!概要 Scalable network services(可伸缩的网络服务) Event-driven processing(事件驱动处理) Rea原创 2020-10-17 15:13:30 · 752 阅读 · 1 评论 -
Java NIO:详细解析NIO中的“零拷贝”以及于IO的效率对比
概述在现在各种RPC框架、网络编程框架中,底层大量的使用了Java NIO作为效率的保证,NIO对比IO有着无与伦比的性能优势,才保证了各种高并发场景下的系统承载能力,其中不得不提的就是“零拷贝”,“零拷贝”是决定NIO性能的关键性因素,但是其又受限于底层操作系统的支持。“零拷贝”特性是通过程序层来调用 native方法,进而借助于操作系统底层的特殊IO实现的,就像字面意思一样,操作系统通过了一些设计上的优化,达到了减少操作数据过程中的拷贝次数、切换“上下文”的次数,从而极大的提升了数据传输效率。原创 2020-10-14 00:51:08 · 866 阅读 · 1 评论 -
Java NIO:在网络编程中的基本范式
在我的专栏Java NIO中,已经简单的完成了对Java NIO的基本学习,本篇将完成一个Server - Client的完整示例,演示一下学习成果,对Java NIO在网络编程中的应用做一个总结服务端:package com.leolee.nio;import java.io.IOException;import java.net.InetSocketAddress;import java.net.ServerSocket;import java.nio.ByteBuffer;imp原创 2020-09-24 10:32:25 · 238 阅读 · 0 评论 -
Java NIO:Selector详解以及在网络编程中的应用
概述Selector <---> Channel <---> Buffer,三者都支持双向的数据传递在NIO网络编程中,Selector&Channel&Buffer三者的关系是十分紧密的,Buffer从Channel中读写,Channel注册在Selector中。在以往的网络编程中,通常都是通过创建一个线程来维护一个socket通讯,在业务量较小时,是可以很好的完成工作的,但是一旦客户端增多,创建的线程也随之增多,对硬件的开销是非常大的。这时候NIO的S原创 2020-09-23 18:40:20 · 350 阅读 · 0 评论 -
Java NIO:Scattering和Gathering的理解
示例解析package com.leolee.nio;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.util.Arrays;/** * @ClassName Sca原创 2020-09-20 12:57:02 · 405 阅读 · 0 评论 -
Java NIO:文件锁——FileLock
NIO学习笔记(八)FileLock文件锁的使用1、执行锁定的操作FileLock lock(long position , long size , boolean shared)方法的作用是获取此通道的文件给定区域上的锁定。在可以锁定该区须之前、已关闭此通道之前或者已中断调用线程之前,将阻塞此方法的调用。再次方法调用期间,如果另一个线程关闭了此通道,则会抛出AsynchronousCloseException异常。如果等待获取锁定的同时中断了调用线程,则将状态设置为中断并抛出FileLockI转载 2020-09-19 22:21:11 · 524 阅读 · 0 评论 -
Java NIO:Buffer缓冲区源码详解以及“零拷贝”
注:NIO源码由机器生成,格式有点乱option & limit & capacity/* * 功能描述: <br> 分析 option limit capacity的变化 * 〈〉 * @Param: [] * @Return: void * @Author: LeoLee * @Date: 2020/9/18 11:19 */ public static void testIntBuffe原创 2020-09-19 20:06:55 · 359 阅读 · 0 评论 -
Java NIO:Pipe(线程间单向数据通讯)详解,附带实例
概述Java NIO 管道是2个线程之间的单向数据连接。Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取。创建管道通过Pipe.open()方法打开管道。例如:Pipe pipe = Pipe.open();要向管道写数据,需要访问sink通道。//创建写管道Pipe.SinkChannel sinkChannel = pipe.sink();String newData = "New String to write to原创 2020-08-14 15:10:38 · 610 阅读 · 0 评论 -
Java NIO:SocketChannel(监听通道)
概述Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道, 就像标准IO中的ServerSocket一样。ServerSocketChannel类在 java.nio.channels包中。ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.socket().bind(new InetSocketAddress(9999))原创 2020-08-12 21:09:03 · 866 阅读 · 0 评论 -
Java NIO: SocketChannel使用详解
概述Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道,是一种面向流连接只sockets套接字的可选择通道,特点如下:SocketChannel是用来连接Socket套接字 SocketChannel主要用途用来处理网络I/O的通道 SocketChannel是基于TCP连接传输 SocketChannel实现了可选择通道,可以被多路复用的创建&关闭SocketChannel//方式1.SocketChannel socketChannel =原创 2020-08-11 11:49:09 · 5124 阅读 · 0 评论 -
Java NIO:DatagramChannel(UDP包通道)
概述Java NIO中的DatagramChannel是一个能收发UDP包的通道。因为UDP是无连接的网络协议,所以不能像其它通道那样读取和写入,它发送和接收的是数据包。UDP简单的来讲,UDP协议和TCP协议不同在于,TCP是可靠的连接协议,需要通过“三次握手”来建立连接,TCP提供的是面向连接的、可靠的数据流传输,可避免数据传输错误,面向连接的协议在任何数据传输前就建立好了点到点的连接。而UDP协议提供高效率的服务,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数原创 2020-08-07 17:11:46 · 699 阅读 · 1 评论 -
Java NIO:Selecor(通道选择器)
Selecor在NIO中的作用Selector在Java NIO中可以检测到一个或者多个Channel,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个Channel,从而管理多个网络连接。这样的单个线程管理管理多个Channel可以极大的减少线程间切换的开销。Selector的创建Selector selector = Selector.open();向Selector注册通道channel.configureBlocking(false);Sel转载 2020-08-06 23:27:27 · 326 阅读 · 0 评论 -
Java NIO:Buffer缓冲区的基本原理
学习NIO,首先要知道的就是三大核心部分:Channel(通道),Buffer(缓冲区), Selector。传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。NIO中的关键Buffer实现有:ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer,分别对应基本数据类型: byte, ch原创 2020-07-06 17:20:33 · 691 阅读 · 0 评论 -
JAVA字节流和字符流的区别
之前在复习IO的时候,为了方便记忆,提到了以Stream结尾的为字节流,以Writer或者Reader结尾的为字符流。除了在使用上的不一样,那究竟两者有什么区别呢。直接给出结论:字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。测试方法:使用OutputStream和Writer分别对文本文件做写入,但是并不关闭、不刷新(flush)输出流,执行后看是否能成功写入。OutputStreampackage com.leol..原创 2020-07-02 15:02:45 · 4698 阅读 · 0 评论 -
重温Java IO
概念流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作IO流的分类根据处理数据类型的不同分为:字符流和字节流(以Stream结尾的为字节流,以Writer或者Reader结尾的为字符流) 根据数据流向不同分为:输入流和输出流(所有的输入流都是抽象类Iupu...原创 2020-01-17 10:57:29 · 218 阅读 · 0 评论