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. 监控

JAVA NIO复习笔记的更多相关文章

  1. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  2. Java基础复习笔记系列 八 多线程编程

    Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...

  3. Java基础复习笔记系列 七 IO操作

    Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...

  4. Java基础复习笔记系列 五 常用类

    Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...

  5. Java基础复习笔记系列 四 数组

    Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...

  6. Java基础复习笔记基本排序算法

    Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...

  7. Java NIO学习笔记

    Java NIO学习笔记 一 基本概念 IO 是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成. 所有语言运行时系统提供执 ...

  8. 零拷贝详解 Java NIO学习笔记四(零拷贝详解)

    转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...

  9. Java NIO 学习笔记(七)----NIO/IO 的对比和总结

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

随机推荐

  1. C++经典编程题#5:寻找下标

    总时间限制:  1000ms 内存限制:  65536kB 描述 已知一个整数数组x[],其中的元素彼此都不相同.找出给定的数组中是否有一个元素满足x[i]=i的关系,数组下标从0开始.     举例 ...

  2. 七参数计算正确性验证——Coord软件使用

    我计算了一套七参数,但是别人说计算结果不正确,我只好验证一下. 最后知道为啥算错了,原来是尺度K的单位问题,我计算七参数的单位是PPM,而下面软件的单位是m所以需要除以1000000进行计算. 下面是 ...

  3. jQuery框架的简单使用(H5)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. 使用CollectionView做横向滑动分页效果:

    一开始几页滑动是没有问题的,等滑到三四个页面之后,就出现奇怪的缝隙,一开始死活找不到原因,最后在layout的代理方法minimumLineSpacingForSectionAtIndex返回值设置为 ...

  5. js随机更换

    如果想实现“随机”切换图像,那么我们要使用到几个Math()对象 第一个是random()函数,函数的功能是产生随机数,如果书写为 var a=Math.random() 那么所产生的随机数是0-1( ...

  6. Java基础之读文件——从文件中读取文本(ReadAString)

    控制台程序,使用通道从缓冲区获取数据,读取Java基础之写文件(BufferStateTrace)写入的charData.txt import java.nio.file.*; import java ...

  7. PAT 解题报告 1010. Radix (25)

    1010. Radix (25) Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 11 ...

  8. 使用 CSS 的 :before 和 :after 选择器做一个箭头样式

    对于 :before 和 :after 选择器,大家并不陌生,但是很少有人会主动去用它们.先解释下它们的定义和用法: :before 选择器在被选元素的内容前面插入内容,:after 选择器在被选元素 ...

  9. PostgreSQL 中定义自己需要的数据类型

    PostgreSQL解决某系数据库中的tinyint数据类型问题,创建自己需要的数据类型如下: CREATE DOMAIN tinyint AS smallint CONSTRAINT tinyint ...

  10. application 统计网站访问人数

    参考书<JSP Web 开发案例教程> index.jsp welcome.jsp 显示