資源描述:
《java中的緩沖區(qū)(直接緩沖區(qū)、非直接緩沖區(qū)等)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、·Java中的緩沖區(qū)(直接緩沖區(qū)、非直接緩沖區(qū)等)如果將同步I/O方式下的數(shù)據(jù)傳輸比做數(shù)據(jù)傳輸?shù)牧阈欠绞?這里的零星是指在數(shù)據(jù)傳輸?shù)倪^程中是以零星的字節(jié)方式進(jìn)行的),那么就可以將非阻塞I/O方式下的數(shù)據(jù)傳輸比做數(shù)據(jù)傳輸?shù)募b箱方式(在字節(jié)和低層數(shù)據(jù)傳輸之間,多了一層緩沖區(qū),因此,可以將緩沖區(qū)看做是裝載字節(jié)的集裝箱)?! ∪绻麑⑼絀/O方式下的數(shù)據(jù)傳輸比做數(shù)據(jù)傳輸?shù)牧阈欠绞?這里的零星是指在數(shù)據(jù)傳輸?shù)倪^程中是以零星的字節(jié)方式進(jìn)行的),那么就可以將非阻塞I/O方式下的數(shù)據(jù)傳輸比做數(shù)據(jù)傳輸?shù)募b箱方式(在字節(jié)和低層數(shù)據(jù)傳輸之間,多了
2、一層緩沖區(qū),因此,可以將緩沖區(qū)看做是裝載字節(jié)的集裝箱)。大家可以想象,如果我們要運(yùn)送比較少的貨物,用集裝箱好象有點(diǎn)不太合算,而如果要運(yùn)送上百噸的貨物,用集裝箱來運(yùn)送的成本會(huì)更低。在數(shù)據(jù)傳輸過程中也是一樣,如果數(shù)據(jù)量很小時(shí),使用同步I/O方式會(huì)更適合,如果數(shù)據(jù)量很大時(shí)(一般以G為單位),使用非阻塞I/O方式的效率會(huì)更高。因此,從理論上說,數(shù)據(jù)量越大,使用非阻塞I/O方式的單位成本就會(huì)越低。產(chǎn)生這種結(jié)果的原因和緩沖區(qū)的一些特性有著直接的關(guān)系。在本節(jié)中,將對緩沖區(qū)的一些主要特性進(jìn)行講解,使讀者可以充分理解緩沖區(qū)的概念,并能通過緩沖區(qū)來
3、提高程序的執(zhí)行效率。 創(chuàng)建緩沖區(qū) Java提供了七個(gè)基本的緩沖區(qū),分別由七個(gè)類來管理,它們都可以在java.nio包中找到。這七個(gè)類如下所示: ??ByteBuffer? ShortBuffer? IntBuffer? CharBuffer? FloatBuffer? DoubleBuffer? LongBuffer? st1":*{behavior:url(#ieooui)?} 這七個(gè)類中的方法類似,只是它們的返回值或參數(shù)和相應(yīng)的簡單類型相對應(yīng),如ByteBuffer類的get方法返回了byte類型的數(shù)據(jù),
4、而put方法需要一個(gè)byte類型的參數(shù)。在CharBuffer類中的get和put方法返回和傳遞的數(shù)據(jù)類型就是char。這七個(gè)類都沒有public構(gòu)造方法,因此,它們不能通過new來創(chuàng)建相應(yīng)的對象實(shí)例。這些類都可以通過兩種方式來創(chuàng)建相應(yīng)的對象實(shí)例。 1.通過靜態(tài)方法allocate來創(chuàng)建緩沖區(qū)?! ∵@七類都有一個(gè)靜態(tài)的allocate方法,通過這個(gè)方法可以創(chuàng)建有最大容量限制的緩沖區(qū)對象。allocate的定義如下: ByteBuffer類中的allocate方法: public?static?ByteBuffer?alloc
5、ate(int?capacity) IntBuffer類中的allocate方法: public?static?IntBuffer?allocate(int?capacity) 其他五個(gè)緩沖區(qū)類中的allocate方法定義和上面的定義類似,只是返回值的類型是相應(yīng)的緩沖區(qū)類?! llocate方法有一個(gè)參數(shù)capacity,用來指定緩沖區(qū)容量的最大值。capacity的不能小于0,否則會(huì)拋出一個(gè)IllegalArgumentException異常。使用allocate來創(chuàng)建緩沖區(qū),并不是一下子就分配給緩沖區(qū)capacity大
6、小的空間,而是根據(jù)緩沖區(qū)中存儲(chǔ)數(shù)據(jù)的情況來動(dòng)態(tài)分配緩沖區(qū)的大小(實(shí)際上,在低層Java采用了數(shù)據(jù)結(jié)構(gòu)中的堆來管理緩沖區(qū)的大小),因此,這個(gè)capacity可以是一個(gè)很大的值,如1024*1024(1M)。allocate的使用方法如下: ByteBuffer?byteBuffer?=?ByteBuffer.allocate(1024);? IntBuffer?intBuffer?=?IntBuffer.allocate(1024); 在使用allocate創(chuàng)建緩沖區(qū)時(shí)應(yīng)用注意,capacity的含義隨著緩沖區(qū)的不同而不同。如
7、創(chuàng)建字節(jié)緩沖區(qū)時(shí),capacity指的是字節(jié)數(shù)。而在創(chuàng)建整型(int)緩沖區(qū)時(shí),capacity指的是int型值的數(shù)目,如果轉(zhuǎn)換成字?jǐn)?shù),capacity的值應(yīng)該乘4。如上面代碼中的intBuffer緩沖區(qū)最大可容納的字節(jié)數(shù)是1024*4=4096個(gè)?! ?.通過靜態(tài)方法wrap來創(chuàng)建緩沖區(qū)?! ∈褂胊llocate方法可以創(chuàng)建一個(gè)空的緩沖區(qū)。而wrap方法可以利用已經(jīng)存在的數(shù)據(jù)來創(chuàng)建緩沖區(qū)。wrap方法可以將數(shù)組直接轉(zhuǎn)換成相應(yīng)類型的緩沖區(qū)。wrap方法有兩種重載形式,它們的定義如下: ByteBuffer類中的wrap方法:
8、??public?static?ByteBuffer?wrap(byte[]?array)? public?static?ByteBuffer?wrap(byte[]?array,?int?offset,?int?length) IntBuffer類中的wr