日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java NIO使用及原理分析(二)

發(fā)布時(shí)間:2024/4/17 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java NIO使用及原理分析(二) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

轉(zhuǎn)載自:李會(huì)軍?寧?kù)o致遠(yuǎn)

?

在第一篇中,我們介紹了NIO中的兩個(gè)核心對(duì)象:緩沖區(qū)和通道,在談到緩沖區(qū)時(shí),我們說緩沖區(qū)對(duì)象本質(zhì)上是一個(gè)數(shù)組,但它其實(shí)是一個(gè)特殊的數(shù)組,緩沖區(qū)對(duì)象內(nèi)置了一些機(jī)制,能夠跟蹤和記錄緩沖區(qū)的狀態(tài)變化情況,如果我們使用get()方法從緩沖區(qū)獲取數(shù)據(jù)或者使用put()方法把數(shù)據(jù)寫入緩沖區(qū),都會(huì)引起緩沖區(qū)狀態(tài)的變化。本文為NIO使用及原理分析的第二篇,將會(huì)分析NIO中的Buffer對(duì)象。

在緩沖區(qū)中,最重要的屬性有下面三個(gè),它們一起合作完成對(duì)緩沖區(qū)內(nèi)部狀態(tài)的變化跟蹤:

position:指定了下一個(gè)將要被寫入或者讀取的元素索引,它的值由get()/put()方法自動(dòng)更新,在新創(chuàng)建一個(gè)Buffer對(duì)象時(shí),position被初始化為0。

limit:指定還有多少數(shù)據(jù)需要取出(在從緩沖區(qū)寫入通道時(shí)),或者還有多少空間可以放入數(shù)據(jù)(在從通道讀入緩沖區(qū)時(shí))。

capacity:指定了可以存儲(chǔ)在緩沖區(qū)中的最大數(shù)據(jù)容量,實(shí)際上,它指定了底層數(shù)組的大小,或者至少是指定了準(zhǔn)許我們使用的底層數(shù)組的容量。

以上四個(gè)屬性值之間有一些相對(duì)大小的關(guān)系:0 <= position <= limit <= capacity。如果我們創(chuàng)建一個(gè)新的容量大小為10的ByteBuffer對(duì)象,在初始化的時(shí)候,position設(shè)置為0,limit和 capacity被設(shè)置為10,在以后使用ByteBuffer對(duì)象過程中,capacity的值不會(huì)再發(fā)生變化,而其它兩個(gè)個(gè)將會(huì)隨著使用而變化。四個(gè)屬性值分別如圖所示:

?

現(xiàn)在我們可以從通道中讀取一些數(shù)據(jù)到緩沖區(qū)中,注意從通道讀取數(shù)據(jù),相當(dāng)于往緩沖區(qū)中寫入數(shù)據(jù)。如果讀取4個(gè)自己的數(shù)據(jù),則此時(shí)position的值為4,即下一個(gè)將要被寫入的字節(jié)索引為4,而limit仍然是10,如下圖所示:

?

下一步把讀取的數(shù)據(jù)寫入到輸出通道中,相當(dāng)于從緩沖區(qū)中讀取數(shù)據(jù),在此之前,必須調(diào)用flip()方法,該方法將會(huì)完成兩件事情:

1. 把limit設(shè)置為當(dāng)前的position值?
2. 把position設(shè)置為0

由于position被設(shè)置為0,所以可以保證在下一步輸出時(shí)讀取到的是緩沖區(qū)中的第一個(gè)字節(jié),而limit被設(shè)置為當(dāng)前的position,可以保證讀取的數(shù)據(jù)正好是之前寫入到緩沖區(qū)中的數(shù)據(jù),如下圖所示:

?

現(xiàn)在調(diào)用get()方法從緩沖區(qū)中讀取數(shù)據(jù)寫入到輸出通道,這會(huì)導(dǎo)致position的增加而limit保持不變,但position不會(huì)超過limit的值,所以在讀取我們之前寫入到緩沖區(qū)中的4個(gè)自己之后,position和limit的值都為4,如下圖所示:

?

在從緩沖區(qū)中讀取數(shù)據(jù)完畢后,limit的值仍然保持在我們調(diào)用flip()方法時(shí)的值,調(diào)用clear()方法能夠把所有的狀態(tài)變化設(shè)置為初始化時(shí)的值,如下圖所示:

?

最后我們用一段代碼來驗(yàn)證這個(gè)過程,如下所示:

[java]?view plain?copy

?print?

  • import?java.io.*;??
  • import?java.nio.*;??
  • import?java.nio.channels.*;??
  • ??
  • public?class?Program?{??
  • ????public?static?void?main(String?args[])?throws?Exception?{??
  • ????????FileInputStream?fin?=?new?FileInputStream("d:\\test.txt");??
  • ????????FileChannel?fc?=?fin.getChannel();??
  • ??
  • ????????ByteBuffer?buffer?=?ByteBuffer.allocate(10);??
  • ????????output("初始化",?buffer);??
  • ??
  • ????????fc.read(buffer);??
  • ????????output("調(diào)用read()",?buffer);??
  • ??
  • ????????buffer.flip();??
  • ????????output("調(diào)用flip()",?buffer);??
  • ??
  • ????????while?(buffer.remaining()?>?0)?{??
  • ????????????byte?b?=?buffer.get();??
  • ????????????//?System.out.print(((char)b));??
  • ????????}??
  • ????????output("調(diào)用get()",?buffer);??
  • ??
  • ????????buffer.clear();??
  • ????????output("調(diào)用clear()",?buffer);??
  • ??
  • ????????fin.close();??
  • ????}??
  • ??
  • ????public?static?void?output(String?step,?Buffer?buffer)?{??
  • ????????System.out.println(step?+?"?:?");??
  • ????????System.out.print("capacity:?"?+?buffer.capacity()?+?",?");??
  • ????????System.out.print("position:?"?+?buffer.position()?+?",?");??
  • ????????System.out.println("limit:?"?+?buffer.limit());??
  • ????????System.out.println();??
  • ????}??
  • }??
  • 完成的輸出結(jié)果為:

    這與我們上面演示的過程一致。在后面的文章中,我們繼續(xù)介紹NIO中關(guān)于緩沖區(qū)一些更高級(jí)的使用。

    (未完待續(xù))

    轉(zhuǎn)載于:https://my.oschina.net/tantexian/blog/707865

    總結(jié)

    以上是生活随笔為你收集整理的Java NIO使用及原理分析(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。