java之NIO

1 java NIO概述

           NIO和BIO有着相同的目的,都是用于进行输入/输出,但NIO使用了不同的方式来处理输入/输出。NIO采用内存映射文件的方式来处理输入/输出,NIO将文件或者文件的一段区域映射到内存中,这样就可以像访问内存一样来访问文件了,通过这种方式来进行输入/输出比BIO的方式输入/输出要快得多。
           java中与NIO相关的主要类组成元素有 Buffer,  Channel,  Selector.
                Buffer可以理解为一个容器,它的本质是一个数组,发送到Channel中的所有对象都必须首先放到Buffer中,而从Channel中读取的数据也必须先放到Buffer中。
                Channel是对传统的输入/输出系统的模拟,NIO中的数据都是通过Channel传输; Channel与传统的InputStream,OutputStream最大的区别在于它提供了一个map()方法,通过该map()方法可以直接将“一块数据”映射到内存当中。如果说传统的输入/输出系统是面向流处理,则NIO则是面向块处理。

         1.1 Buffer的使用

                    Buffer是一个抽象类,其最常用的子类是ByteBuffer,它可以在底层字节数组上进行get/set操作。除了ByteBuffer之外,对应于其他基本数据类型都有相应的Buffer类.这些子               类也都没有构造器。
                    static XxxBuffer  allocate(int capacity) : 创建一个容量为capacity的XxxBuffer对象。使用较多的一般是ByteBuffer和CharBuffer。
                    在Buffer中有三个重要的概念:容量(capacity),界限(limit), 位置(position)。
                            容量(capacity): 缓冲区的容量表示该Buffer最大的数据容量,即最多可以存储多少数据。值不可以为负数,一旦创建之后不可以更改。
                            界限(limit) : 第一个不可被读/写的数据缓冲区的位置索引,也就是说limit后的数据不可被读和写。
                            位置(position) :  用于指明下一个可以被读出的或者写入的缓冲区位置索引。
                    Buffer中常用方法:
                        int capacity() : 返回Buffer的容量大小。
                        boolean  hasRemaining()  : 判断当前位置和界限之间是否还有元素可供处理。
                        int limit()  :  返回Buffer的界限位置。
                        Buffer  limit(int newlt) : 重新设置界限的值,并返回一个具有新的limit的缓冲区对象。
                        Buffer  mark() : 设置Buffer的mark位置, 它只能在0和位置之间做mark.
                        int   position()  :   返回Buffer中的position位置。
                        Buffer position(int newPs) : 设置Buffer的position, 并返回position被修改后的Buffer对象。
                        int  remaining() : 返回当前的位置和界限之间元素的个数。
                        Buffer reset() :  将位置转到mark所在的位置。
                        Buffer   rewind() :  将位置设置成0, 取消设置的mark.
                        void   put()  :  向Buffer中存放一些数据。
                        void   flip()   :  将limit设置到position的位置
                        void   clear()  :   将position置为0,将limit置为capacity, 这样为再次向Buffer中装入数据做好准备。
               Buffer中读入一些数据后的示意图如下:

Buffer示意图

        1.2 使用Channel

                    Channel类似于传统的流对象,当时与传统的流对象有两个主要的区别,
                            Channel可以直接将指定文件的部分或全部直接映射成Buffer。
                            程序不能直接通过访问Channel中的数据,包括读和写都不行,Channel只能与Buffer进行交互。所有的Channel都不应该通过构造器来直接创建。而是通过传统的节点                     InputStream, OutputStream的getChannel()方法来返回对应的Channel,不同的节点流获得的Channel不一样。如:FileInputStream,FileOutputStream  getChannel()返回                         的是FileChannel, PipedInputStream和PipedOutputStream的getChannel()的方法返回的是Pipe.SinkChannel和Pipe.SourceChannel。
                   channel的常用方法有
                        map() : 用于将channel的部分或者全部数据映射成对应的Buffer。
                        read() : 从Buffer中读数据。
                        write() : 从Buffer中写数据。

          1.3 文件锁     

                    FileChannel中提供了lock()/tryLock()方法可以获得文件锁FileLock对象,从而锁定文件,方法如: lock() 如果无法得到文件锁,程序将一直阻塞,tryLock()是尝试锁定文                      件,它将直接返回而不是阻塞,如果获取到了文件锁,将返回文件锁,否则返回null。
                    lock(long position, long size, boolean shared) : 对文件从position的位置开始长度为size的内容加锁, 第3个参数是设置是共享锁还是排他锁。该方法是阻塞试方法
                    tryLock(long position, long size, boolean shared) : 对文件从position的位置开始长度为size的内容加锁, 第3个参数是设置是共享锁还是排他锁。该方法是非阻塞试方法

    
               

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354