Buffer 在我們考慮非阻隔套接字以前,不得不花費(fèi)一些時(shí)間在一個(gè)新的Java 1.4的類:java.nio.Buffer上。一個(gè)Buffer實(shí)例只是原始數(shù)據(jù)的一個(gè)有限的容器。
![]()
稱其有限是因?yàn)樗荒馨邢迶?shù)量的字節(jié);換句語(yǔ)說(shuō),它不是一個(gè)像Vector或是ArrayList一樣的容器,后兩者從理論上說(shuō)是沒(méi)有限度的。另外,一個(gè)Buffer實(shí)例僅能包含屬于Java的基本數(shù)據(jù)類型。例如:int,char,double,Boolean,等等。
Buffer類是一個(gè)抽象類,它有7個(gè)子類分別對(duì)應(yīng)于七種基本的數(shù)據(jù)類型:
●ByteBuffer
●CharBuffer
●DoubleBuffer
●FloatBuffer
●IntBuffer
●LongBuffer
●ShortBuffer
在非阻隔套接字編程中,通常所有新 I/O系統(tǒng)能工作的環(huán)境中,極其重要的是解決Buffer對(duì)象如何工作。這是因?yàn)樾绿捉幼滞ǖ朗褂肂uffer對(duì)象通過(guò)網(wǎng)絡(luò)來(lái)傳送數(shù)據(jù)。
你可以使用以下靜態(tài)方法(即類方法)來(lái)創(chuàng)建一個(gè)新的Buffer實(shí)例:allocate,allocateDirect,wrap。在下面的例子中,三個(gè)Buffer對(duì)象將用三種不同的方法來(lái)實(shí)例化。
ByteBuffer buffer1 = ByteBuffer.allocate(1024);
ByteBuffer buffer2 = ByteBuffer.allocateDirect(1024);
ByteBuffer buffer3 = ByteBuffer.wrap(new String("hello").getBytes());
這段代碼的前兩行創(chuàng)建了兩個(gè)ByteBuffer對(duì)象,它們都包含1024個(gè)字節(jié)。allocate和allocateDirect方法都做了相同的工作,不同的是第二個(gè)方法直接使用
操作系統(tǒng)來(lái)分配Buffer。從而它將提供更快的訪問(wèn)速度。不幸的是,并非所有的虛擬機(jī)都支持這種直接分配的方法。第三行使用wrap方法。它創(chuàng)建了一個(gè)ByteBuffer對(duì)象,包含的字節(jié)由字符串“hello”組成。
Buffer對(duì)象的作用或多或少的與流的作用相似。“當(dāng)前位置(current position)”是一個(gè)極其重要的概念,它計(jì)算出你將要處理的Buffer對(duì)象的適當(dāng)?shù)奈恢谩T谌魏螘r(shí)候,一個(gè)Buffer對(duì)象都有一個(gè)當(dāng)前位置指向某一項(xiàng)。之后,每一次讀或?qū)懖僮鞫紩?huì)自動(dòng)的將當(dāng)前位置指向Buffer中的下一項(xiàng)。
你可以用put方法寫入一些數(shù)據(jù)到Buffer中: