- NIO與Socket編程技術(shù)指南
- 高洪巖
- 1623字
- 2019-01-05 05:42:04
1.5 CharBuffer類的API使用
CharBuffer類提供一個(gè)字符(char)序列緩沖區(qū)。
1.5.1 重載append(char)/append(CharSequence)/append(CharSequence, start, end)方法的使用
public CharBuffer append(char c)方法的作用:將指定字符添加到此緩沖區(qū)(可選操作)。調(diào)用此方法的形式為dst.append(c),該調(diào)用與以下調(diào)用完全相同:dst.put(c)。
public CharBuffer append(CharSequence csq)方法的作用:將指定的字符序列添加到此緩沖區(qū)(可選操作)。調(diào)用此方法的形式為dst.append(csq),該調(diào)用與以下調(diào)用完全相同:dst.put(csq.toString()),有可能沒有添加整個(gè)序列,這取決于針對(duì)字符序列csq的toString規(guī)范。例如,調(diào)用字符緩沖區(qū)的toString()方法將返回一個(gè)子序列,其內(nèi)容取決于緩沖區(qū)的位置和限制。
public CharBuffer append(CharSequence csq, int start, int end)方法的作用:將指定字符序列的子序列添加到此緩沖區(qū)(可選操作)。當(dāng)csq不為null時(shí),調(diào)用此方法的形式為dst. append(csq, start, end),該調(diào)用與以下調(diào)用完全相同:dst.put(csq.subSequence(start, end). toString())。
示例代碼如下:
public class Test1 { public static void main(String[] args) { CharBuffer charbuffer = CharBuffer.allocate(15); System.out.println("A " + charbuffer.position()); charbuffer.append('a'); System.out.println("B " + charbuffer.position()); charbuffer.append("bcdefg"); System.out.println("C " + charbuffer.position()); charbuffer.append("abchijklmn", 3, 8); System.out.println("D " + charbuffer.position()); char[] newArray = charbuffer.array(); for (int i = 0; i < newArray.length; i++) { System.out.print(newArray[i] + " "); } System.out.println(); System.out.println("charbuffer capacity=" + charbuffer.capacity()); } }
程序運(yùn)行結(jié)果如下:
A 0 B 1 C 7 D 12 a b c d e f g h i j k l charbuffer capacity=15
1.5.2 讀取相對(duì)于當(dāng)前位置的給定索引處的字符
public final char charAt(int index)方法的作用:讀取相對(duì)于當(dāng)前位置的給定索引處的字符。
示例代碼如下:
public class Test2 { public static void main(String[] args) { CharBuffer charbuffer = CharBuffer.allocate(10); charbuffer.append("abcdefg"); charbuffer.position(2); System.out.println(charbuffer.charAt(0)); System.out.println(charbuffer.charAt(1)); System.out.println(charbuffer.charAt(2)); } }
程序運(yùn)行結(jié)果如下:
c d e
1.5.3 put(String src)、int read(CharBuffer target)和subSequence(int start, int end)方法的使用
put(String src)方法的作用:相對(duì)批量put方法(可選操作)。此方法將給定源字符串中的所有內(nèi)容傳輸?shù)酱司彌_區(qū)的當(dāng)前位置。調(diào)用此方法的形式為dst.put(s),該調(diào)用與以下調(diào)用完全相同:dst.put(s, 0, s.length())。
int read(CharBuffer target)方法的作用:試圖將當(dāng)前字符緩沖區(qū)中的字符寫入指定的字符緩沖區(qū)。緩沖區(qū)可照原樣用作字符的存儲(chǔ)庫:所做的唯一更改是put操作的結(jié)果。不對(duì)緩沖區(qū)執(zhí)行翻轉(zhuǎn)或重繞操作。
subSequence(int start, int end)方法的作用:創(chuàng)建表示此緩沖區(qū)的指定序列、相對(duì)于當(dāng)前位置的新字符緩沖區(qū)。新緩沖區(qū)將共享此緩沖區(qū)的內(nèi)容,即如果此緩沖區(qū)的內(nèi)容是可變的,則修改一個(gè)緩沖區(qū)將導(dǎo)致另一個(gè)緩沖區(qū)被修改。新緩沖區(qū)的容量將為此緩沖區(qū)的容量,其位置將為position() + start,其限制將為position() + end。當(dāng)且僅當(dāng)此緩沖區(qū)為直接緩沖區(qū)時(shí),新緩沖區(qū)才是直接緩沖區(qū)。當(dāng)且僅當(dāng)此緩沖區(qū)為只讀時(shí),新緩沖區(qū)才是只讀的。其中兩個(gè)參數(shù)的解釋如下。
1)start:子序列中第一個(gè)字符相對(duì)于當(dāng)前位置的索引;必須為非負(fù)且不大于remaining()。
2)end:子序列中最后一個(gè)字符后面的字符相對(duì)于當(dāng)前位置的索引;必須不小于start且不大于remaining()。
示例代碼如下:
public class Test3 { public static void main(String[] args) throws IOException { CharBuffer buffer1 = CharBuffer.allocate(8); buffer1.append("ab123456"); buffer1.position(2); buffer1.put("cde"); buffer1.rewind(); for (int i = 0; i < buffer1.limit(); i++) { System.out.print(buffer1.get()); } System.out.println(); buffer1.position(1); CharBuffer buffer2 = CharBuffer.allocate(4); System.out.println("A buffer2 position=" + buffer2.position()); buffer1.read(buffer2); // read()相當(dāng)于position是1進(jìn)行導(dǎo)出 System.out.println("B buffer2 position=" + buffer2.position()); buffer2.rewind(); for (int i = 0; i < buffer2.limit(); i++) { System.out.print(buffer2.get()); } System.out.println(); buffer1.position(2); CharBuffer buffer3 = buffer1.subSequence(0, 2); System.out.println("C buffer3 position=" + buffer3.position() + " capacity=" + buffer3.capacity() + " limit=" + buffer3.limit()); for (int i = buffer3.position(); i < buffer3.limit(); i++) { System.out.print(buffer3.get()); } } }
程序運(yùn)行結(jié)果如下:
abcde456 A buffer2 position=0 B buffer2 position=4 bcde C buffer3 position=2 capacity=8 limit=4 cd
1.5.4 static CharBuffer wrap(CharSequence csq, int start, int end)方法的使用
public static CharBuffer wrap(CharSequence csq, int start, int end)方法的作用:將字符序列包裝到緩沖區(qū)中。新的只讀緩沖區(qū)的內(nèi)容將為給定字符序列的內(nèi)容。緩沖區(qū)的容量將為csq.length(),其位置將為start,其限制將為end,其標(biāo)記是未定義的。
1)參數(shù)csq代表字符序列,新的字符緩沖區(qū)將從中創(chuàng)建。
2)參數(shù)start代表要使用的第一個(gè)字符的索引,必須為非負(fù)且不大于csq.length()。新緩沖區(qū)的位置將被設(shè)置為此值。
3)參數(shù)end代表要使用的最后一個(gè)字符后面的字符的索引,必須不小于start且不大于csq.length()。將新緩沖區(qū)的限制設(shè)置為此值。返回值是新的字符緩沖區(qū)。
示例代碼如下:
public class Test4 { public static void main(String[] args) throws IOException { CharBuffer charbuffer1 = CharBuffer.wrap("abcdefg", 3, 5); System.out.println("capacity=" + charbuffer1.capacity() + " limit=" + charbuffer1.limit() + " position=" + charbuffer1.position()); for (int i = 0; i < charbuffer1.limit(); i++) { System.out.print(charbuffer1.get(i) + " "); } charbuffer1.append("我是只讀的,不能添加數(shù)據(jù),會(huì)出現(xiàn)異常!"); } }
程序運(yùn)行結(jié)果如下:
capacity=7 limit=5 position=3 Exception in thread "main" a b c d e java.nio.ReadOnlyBufferException at java.nio.CharBuffer.put(CharBuffer.java:920) at java.nio.CharBuffer.put(CharBuffer.java:950) at java.nio.CharBuffer.append(CharBuffer.java:1351) at CharBufferAPITest.Test4.main(Test4.java:14)
1.5.5 獲得字符緩沖區(qū)的長度
public final int length()方法的作用:返回此字符緩沖區(qū)的長度。當(dāng)將字符緩沖區(qū)視為字符序列時(shí),長度只是該位置(包括)和限制(不包括)之間的字符數(shù),即長度等效于remaining()。
length()方法的內(nèi)部源代碼如下:
public final int length() { return remaining(); }
示例代碼如下:
public class Test5 { public static void main(String[] args) throws IOException { CharBuffer charbuffer1 = CharBuffer.wrap("abcd"); System.out.println("position=" + charbuffer1.position() + " remaining=" + charbuffer1.remaining() + " length=" + charbuffer1.length()); System.out.println(charbuffer1.get()); System.out.println("position=" + charbuffer1.position() + " remaining=" + charbuffer1.remaining() + " length=" + charbuffer1.length()); System.out.println(charbuffer1.get()); System.out.println("position=" + charbuffer1.position() + " remaining=" + charbuffer1.remaining() + " length=" + charbuffer1.length()); System.out.println(charbuffer1.get()); System.out.println("position=" + charbuffer1.position() + " remaining=" + charbuffer1.remaining() + " length=" + charbuffer1.length()); System.out.println(charbuffer1.get()); System.out.println("position=" + charbuffer1.position() + " remaining=" + charbuffer1.remaining() + " length=" + charbuffer1.length()); } }
程序運(yùn)行結(jié)果如下:
position=0 remaining=4 length=4 a position=1 remaining=3 length=3 b position=2 remaining=2 length=2 c position=3 remaining=1 length=1 d position=4 remaining=0 length=0
- Mastering OpenLayers 3
- Spring Boot開發(fā)與測試實(shí)戰(zhàn)
- Learning Spring 5.0
- 劍指JVM:虛擬機(jī)實(shí)踐與性能調(diào)優(yōu)
- 數(shù)據(jù)庫系統(tǒng)原理及MySQL應(yīng)用教程
- Building Mobile Applications Using Kendo UI Mobile and ASP.NET Web API
- Podman實(shí)戰(zhàn)
- 用Flutter極速構(gòu)建原生應(yīng)用
- Instant Lucene.NET
- Create React App 2 Quick Start Guide
- Swift 4從零到精通iOS開發(fā)
- Visual C#.NET Web應(yīng)用程序設(shè)計(jì)
- Unity&VR游戲美術(shù)設(shè)計(jì)實(shí)戰(zhàn)
- INSTANT Apache Hive Essentials How-to
- Learning Shiny