日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

發(fā)布時(shí)間:2024/4/17 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java NIO使用及原理分析(二) 小編覺(jué)得挺不錯(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í),我們說(shuō)緩沖區(qū)對(duì)象本質(zhì)上是一個(gè)數(shù)組,但它其實(shí)是一個(gè)特殊的數(shù)組,緩沖區(qū)對(duì)象內(nèi)置了一些機(jī)制,能夠跟蹤和記錄緩沖區(qū)的狀態(tài)變化情況,如果我們使用get()方法從緩沖區(qū)獲取數(shù)據(jù)或者使用put()方法把數(shù)據(jù)寫(xiě)入緩沖區(qū),都會(huì)引起緩沖區(qū)狀態(tài)的變化。本文為NIO使用及原理分析的第二篇,將會(huì)分析NIO中的Buffer對(duì)象。

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

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

limit:指定還有多少數(shù)據(jù)需要取出(在從緩沖區(qū)寫(xiě)入通道時(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ì)象過(guò)程中,capacity的值不會(huì)再發(fā)生變化,而其它兩個(gè)個(gè)將會(huì)隨著使用而變化。四個(gè)屬性值分別如圖所示:

?

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

?

下一步把讀取的數(shù)據(jù)寫(xiě)入到輸出通道中,相當(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ù)正好是之前寫(xiě)入到緩沖區(qū)中的數(shù)據(jù),如下圖所示:

?

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

?

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

?

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

[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é)果為:

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

    (未完待續(xù))

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

    總結(jié)

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

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