zoukankan      html  css  js  c++  java
  • JAVA NIO复习笔记

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

  • 相关阅读:
    [翻译]ASP.NET MVC 3 开发的20个秘诀(六)[20 Recipes for Programming MVC 3]:找回忘记的密码
    No.9425 [翻译]开发之前设计先行
    [翻译]ASP.NET MVC 3 开发的20个秘诀(五)[20 Recipes for Programming MVC 3]:发送欢迎邮件
    内联(inline)函数与虚函数(virtual)的讨论
    内联函数、模板、头文件杂记(转)
    gdb使用整理
    data structure and algorithm analysis上一点摘录
    lsof by example 例子
    linux core文件机制
    转一篇shared_ptr的小文
  • 原文地址:https://www.cnblogs.com/Jtianlin/p/5196168.html
Copyright © 2011-2022 走看看