1. JAVA NIO是什么?

从JDK1.4开始,java提供了一系列改进的输入/输出处理的新功能,这些功能被统称为新IO(New IO,简称NIO),新增了许多用于处理输入/输出的类,这些类都被放在java.nio包以及子包下,

并且对原java.io包中的许多类都以NIO为基础进行了改写。

2. 为什么使用JAVA NIO?

NIO和传统的IO有相同的目的,都是用于进行输入/输出,但新IO采用内存映射文件的方式来处理输入/输出,新IO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样来访问文件了

(模拟了操作系统上的虚拟内存的概念),通过这种方式来进行输入/输出比传统的输入/输出要快得多。

3. JAVA NIO与IO有什么区别?

    1). Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。

    2). Java IO的各种流是阻塞的。 Java NIO的非阻塞模式

    3). Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道

1). Channel类似于传统的流对象,但与传统的流对象有两个主要区别:

a) Channel可以直接将指定文件的部分或者全部直接映射成Buffer。

b). 程序不能像访问流那样直接访问Channel中的数据(包括读取、写入),Channel只能和Buffer进行交互。即,如果要从Channel中取得数据,必须先使用Buffer从Channel中取出一些数据,然后

让程序再从Buffer中取得这些数据。写入也一样。

2). 在NIO中加入Buffer对象,体现了NIO库与传统I/O的一个重要区别。在面向流的I/O中,我们将数据直接写入或者将数据直接读到Stream对象中。而在NIO库中,所有数据都是用缓冲区处理的。

4. 骨架

1). Buffer:Buffer类都没有提供构造器,而是通过具体子类: XxxBuffer.allocate(int capaticy); 来创建一个容量为capacity的XxxBuffer对象

2). Channel:Channel类似于传统的流对象.和Buffer一样,所有的Channel都不应该通过构造器来直接创建吗,而是通过传统的节点InputStream、OutputStream的getChannel()方法来返回对应

的Channel,不同的节点流获得的Channel是不一样的。

3). Charset:该类包含了用于创建解码器、编码器的方法。java7新增了一个StandardCharsets类,该类里包含了ISO-8859-1、UTF-8、UTF-16等静态Field,这些静态Field代表了

4). java.nio.file包

a. Path: 代表了一个平台无关的路径

b. Paths: 包含了2个返回Path的静态工厂方法

2.1) Path get(String first, String... more): 将给定的多个字符串进行拼接

2.2) get(URI uri)

c. Files: 提供了大量的高性能方法来操作文件

d. FileVisitor: 使用FileVisitor来遍历文件和目录,在编程时可以通过继承SimpleFileVisitor来实现自己的"文件访问器",这样就可以根据需要,选择性地重写指定方法

e. java.nio.file.attribute

5. 怎么用?

1). Buffer类都没有提供构造器,而是通过具体子类: XxxBuffer.allocate(int capaticy); 来创建一个容量为capacity的XxxBuffer对象

2). 和Buffer一样,所有的Channel都不应该通过构造器来直接创建吗,而是通过传统的节点InputStream、OutputStream的getChannel()方法来返回对应的Channel,不同的节点流获得的Channel是不一样的。

参见:http://www.cnblogs.com/Jtianlin/p/4508299.html

http://www.cnblogs.com/littlehann/p/3720396.html

6. 使用注意事项

    1). map():用于将Channel对应的部分、或全部数据映射成Buffer  MappedByteBuffer map(FileChannel.MapMode mode, long position, long size)

有时候,如果遇到Channel对应的文件太大,无法一次性全部Map到内存中、或者使用map()方法一次将所有的文件内容映射到内存中会引起性能下降,也可以使用Channel的Buffer的"分批逐段读取"的方法

2). 注意每次迭代末尾的keyIterator.remove()调用

3). 用完FileChannel后必须将其关闭:channel.close();

4). SelectionKey key = channel.register(selector,Selectionkey.OP_READ);

7. 优化

1). JDK 6.0 以及JDK 5.0 update 9 的 nio支持epoll (仅限 Linux 系统 ),对并发idle connection会有大幅度的性能提升,这就是很多网络服务器应用程序需要的。启用的方法如下:

-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider

在 Linux 下运行的 Tomcat 使用 NIO Connector ,那么启用 epoll 对性能的提升会有帮助。而 Tomcat 要启用这个选项的做法是在 catalina.sh 的开头加入下面这一行

CATALINA_OPTS='-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider'

jdk7.0 已经有AIO(非阻塞IO)了,其就是基于epoll实现的!

2). DirectBuffer 继承自 ByteBuffer,DirectBuffer 相对于 ByteBuffer 而言,读写访问速度快很多,但是创建和销毁 DirectrBuffer 的花费却比 ByteBuffer 高。

8. 监控

最新文章

  1. CentOS x64上Matlab R2015b的镜像安装方法与卸载
  2. android中ColorStateList及StateListDrawable设置Selector
  3. 移动开发框架剖析(一) Hammer专业的手势控制
  4. 详解 Array.prototype.slice.call(arguments)
  5. css常用技巧
  6. uml中定义的关系详细详解
  7. Mistral 工作流组件之一 概述
  8. uva 10163 - Storage Keepers(01背包)
  9. [Android学习笔记]Context简单理解
  10. 【修复】当Deepin开机进入BusyBox时修复
  11. Linux:Day6(下) vim编辑器
  12. bzoj2212[Poi2011]Tree Rotations [线段树合并]
  13. jupyter notebook新用法
  14. [No0000126]SSL/TLS原理详解与WCF中的WS-Security
  15. because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled
  16. shapefile与字符集编码设置
  17. 详解Java多线程编程中LockSupport类的线程阻塞用法
  18. 华硕笔记本U盘重装系统
  19. 探索解析微服务下的RabbitMQ
  20. Google官方教程之Selling In-app Products

热门文章

  1. mac共享文件给win7用户
  2. Ubuntu下面安装eclipse for c++
  3. 在CentOS6.5上安装Tomcat7
  4. LeetCode Peeking Iterator
  5. Linux命令行–走进shell
  6. Windows平台注册mysql服务
  7. Groupon面经:Find paths in a binary tree summing to a target value
  8. 配置suse自动化安装
  9. (转)flexigrid 参数说明
  10. using 名称空间指定一个别名