NIO学习笔记

Java SE 1.4引入了大量用于改进输入/输出处理机制的特性,它们位于java.nio包。
该包中包含对下列特性的支持:
字符集编码器和解码器
非阻塞的I/O
内存映射文件
文件加锁机制

1.内存映射文件
大多数操纵系统都可以利用虚拟内存实现来将一个文件或者文件的一部分“映射”到内存中。然后,这个文件就可以当做是内存数组一样地访问,这比传统的文件操作要快得多。
在使用内存映射时,我们创建了单一的缓冲区横跨整个文件或我们感兴趣的文件区域。我们还可以使用更多的缓冲区来读写大小适度的信息块。
Buffer类是一个抽象类,它由众多的具体子类,包括ByteBuffer、CharBuffer、DoubleBuffer、IntBuffer、LongBuffer和ShortBuffer。在实践中,最常用的是ByteBuffer和CharBuffer。StringBuffer类与这些缓冲区没有关系。
后续补充对应的方法
2.文件加锁机制
文件锁可以控制对文件或者文件中某个范围的字节的访问,但是,文件加锁机制在不同的操作系统之间变化很大,这也就解释了为什么在JDK以前的版本中没有文件加锁能力。
要锁定一个文件,可以调用FileChannel类的lock或者tryLock方法
FileLock lock=channel.lock();
或者
FileLock lock=channel.trylock();
第一个调用会阻塞直至获得锁,而第二个调用将立即返回,要么返回锁,要么在锁不可以获得的情况下返回null。这个文件将保持锁定状态,直至这个通道关闭,或者在锁上再调用了release方法。

=================================
Selector(选择器)
是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。
为什么使用Selector?
仅用单个线程来处理多个Channels的好处是,只需要更少的线程来处理通道。事实上,可以只用一个线程处理所有的通道。对于操作系统来说,线程之间上下文切换的开销很大,而且每个线程都要占用系统的一些资源(如内存)。因此,使用的线程越少越好
但是,需要记住,现代的操作系统和CPU在多任务方面表现的越来越好,所以多线程的开销随着时间的推移,变得越来越小了。实际上,如果一个CPU有多个内核,不使用多任务可能是在浪费CPU能力。不管怎么说,关于那种设计的讨论应该放在另一篇不同的文章中。在这里,只要知道使用Selector能够处理多个通道就足够了。

===================================
NIO包的设计模式是装饰器模式,该模式的细节暂未搞清楚。

猜你喜欢

转载自blog.csdn.net/sdtvyyb_007/article/details/79343670
今日推荐