摘要:特点面向块的传统是面向流的。有四个基本属性容量,能够容纳的最大元素数目,在创建时设定并不能更改中有效位置数目,不能对超过中的区域进行读写。与缓冲区不同,通道主要由接口指定。方法获取支持的所有字符集获取实例编解码文件锁进程级支持文件锁定功能。
简介
NIO的所有类都被放在java.nio包或其子包下。
特点面向块的I/O:传统JavaIO是面向流的I/O。流I/O一次处理一个字节。NIO中引入了缓冲区(Buffer)的概念,缓冲区作为传输数据的基本单位块,所有对数据的操作都是基于将数据移进/移出缓冲区而来。
非阻塞的I/O + 就绪性选择:非阻塞I/O则允许线程在有数据的时候处理数据,没有数据的时候干点别的,提高了资源利用率。就绪性选择通常是建立在非阻塞的基础上,并且更进一步,它把检查哪些I/O请求的数据准备好这个任务交给了底层操作系统,操作系统会去查看并返回结果集合,这样我们只需要关心那些准备好进行操作的IO通道。
文件锁定和内存映射文件等操作系统特性:内存映射利用虚拟内存技术提供对文件的高速缓存,使读取磁盘文件就像从内存中读取一样高效,但是却不会有内存泄漏的危险,因为在内存中不会存在文件的完整拷贝。
Buffer 简介Buffer有Byte、Short、Int、Long、Float、DoubleBuffer六个类别,起缓存作用。
Buffer有四个基本属性:
1、capacity 容量,buffer能够容纳的最大元素数目,在Buffer创建时设定并不能更改
2、limit buffer中有效位置数目,不能对超过limit中的区域进行读写。
3、position 下一个读或者写的位置
4、mark 用于记忆的标志位,配合reset()使用,初始值未设定,调用mark后将当前position设为值
利用Buffer读写数据,通常遵循四个步骤:
方法:获取buffer
把数据写入buffer;
调用flip;
从Buffer中读取数据;
调用buffer.clear()或者buffer.compact()
获取: static xxxBuffer allocate(int capacity)//创建容量为capacity的buffer 写入: void putxxx(xxx f) void putxxx(int index, xxx f) void flip()//limit=position,position=0 //方便读取数据 读取: xxx getFloat() xxx getFloat(int index) void clear()//position=0,limit=capacity,方便再次装入数据 其他方法: int capacity()//获取capacity boolean hasRemaining()//是否有元素未处理,即positionChannel Channel和流的区别Channel用于在字节缓冲区和位于通道另一侧的实体(通常是一个文件或套接字)之间有效地传输数据。。与缓冲区不同,通道API主要由接口指定。不同的操作系统上通道实现(Channel Implementation)会有根本性的差异,所以通道API仅仅描述了可以做什么。因此很自然地,通道实现经常使用操作系统的本地代码。通道接口允许您以一种受控且可移植的方式来访问底层的I/O服务。
Channel可以将整个文件或文件的一部分映射成为buffer
Channel是一个对象,可以通过它读取和写入数据。拿 NIO 与原来的 I/O 做个比较,通道就像是流。所有数据都通过 Buffer 对象来处理。您永远不会将字节直接写入通道中,相反,您是将数据写入包含一个或者多个字节的缓冲区。同样,您不会直接从通道中读取字节,而是将数据从通道读入缓冲区,再从缓冲区获取这个字节。
既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。
通道可以异步地读写。
通道中的数据总是要先读到一个 Buffer,或者总是要从一个 Buffer 中写入。
FileChannel对象是线程安全(thread-safe)的。
常用的Channel使用FileChannel:从文件中读写数据。
DatagramChannel:能通过UDP读写网络中的数据。
SocketChannel:能通过TCP读写网络中的数据。
ServerSocketChannel:可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。所有Channel都应该使用传统的流来构建,如:FileChannel channel=fileInputStream.getChannel().
RandomAccessFile也有这个方法,Channel是可读还是可写,取决于它的打开方式r/rwChannel常用方法:
将文件映射到内存 ByteBuffer buffer=channel.map(FileChannel.MapMode.READ_ONLY,0,file.length); 写到Channel channel.write(buffer) 读取到buffer channel.read(byteBuffer) 移动Channel的positon channel.position(long length)字符集和CharsetJAVA默认使用Unicode编码,但是有些操作系统不适用Unicode。
方法获取支持的所有字符集 SortedMap文件锁(进程级)=Charset.availableCharsets() 获取charset实例 charset=Charset.forName("gbk") 编解码 charbuffer=charset.decode(bytebuffer) bytebuffer=charset.encoce(charbuffer/string) FileLock支持文件锁定功能。在FileChannel中提供lock和tryLock方法来获得FileLock对象。
fileLock可以只锁定文件的一部分。lock(long position , long size,boolean shared)//阻塞式
tryLock(long position ,long sized,boolean shared)//非阻塞FileLock lock=fileChannel.tryLock(); dosomething..... lock.release();文件锁是JVM持有的,如果两个进程运行在同一个JVM,则他们不能对同一个文件加锁。
Java NIO学习笔记---Channel
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/67913.html
摘要:而我们现在都已经发布了,的都不知道,这有点说不过去了。而对一个的读写也会有响应的描述符,称为文件描述符,描述符就是一个数字,指向内核中的一个结构体文件路径,数据区等一些属性。 前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 本来我预想是先来回顾一下传统的IO模式的,将传统的IO模式的相关类理清楚(因为IO的类很多)。 但是,发现在整理的过程已...
摘要:一个多路复用器可以负责成千上万的通道,没有上限。不需要通过对多路复用器对注册的通道进行轮询操作即可实现异步读写,从而简化编程模型。同时,支持支持如果是怎么办最后,到目前位置,支持不支持二无法扩展作为的核心,无法扩展,私有构造函数。 前言 netty 学习 基于 netty in action 5th, 官网资料,网络博客等 1.1 Why Netty? netty 是一个中间层的抽象 ...
摘要:理由是如果到了上,而这个对应的操作迟迟不能就绪被出来。但我认为这其实是一个超时处理问题。问题是,原生的是没有超时支持的。如果是回调性质的,一般的做法是正常就绪给一个,超时给另外一个。只要时间合理,作者之前所说的会引发的问题并不会出现。 grizzly框架的作者曾经提到NIO框架不应该使用selection key的attach功能(链接)。理由是如果attach到了selection ...
摘要:上篇文章介绍了通用文件服务组件实现版本,本文介绍基于与的方式实现。根据官网信息可知,它是一个高性能,可为我们的应用提供文件上传服务的组件。程序可通过该对象获取服务器的响应内容。 上篇文章介绍了通用文件服务组件(Netty实现版本),本文介绍基于HTTP与Apache FileUpload的方式实现。代码地址:https://github.com/landy8530/... 1. 实现...
摘要:数据和信息是不可分离的,数据是信息的表达,信息是数据的内涵。数据本身没有意义,数据只有对实体行为产生影响时才成为信息。主要目标是为开发提供天然的模板,并且能在里面准确的显示。目前是自然更加推荐。 这是泥瓦匠的第105篇原创 文章工程: JDK 1.8 Maven 3.5.2 Spring Boot 2.1.3.RELEASE 工程名:springboot-webflux-4-thym...
阅读 998·2021-11-12 10:34
阅读 930·2021-09-30 09:56
阅读 586·2019-08-30 15:54
阅读 2532·2019-08-30 11:14
阅读 1395·2019-08-29 16:44
阅读 3160·2019-08-29 16:35
阅读 2437·2019-08-29 16:22
阅读 2386·2019-08-29 15:39