官术网_书友最值得收藏!

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
主站蜘蛛池模板: 东兴市| 三原县| 高雄县| 辽宁省| 朝阳区| 西畴县| 昆明市| 平阴县| 靖远县| 昆明市| 班玛县| 武冈市| 雷山县| 嘉鱼县| 三门县| 潢川县| 沂水县| 曲靖市| 正安县| 英吉沙县| 英山县| 弋阳县| 城口县| 荃湾区| 沿河| 巴彦县| 原阳县| 建昌县| 伊宁市| 沾益县| 兴城市| 镇沅| 博客| 永康市| 丰镇市| 本溪市| 台山市| 正安县| 射阳县| 和田县| 博乐市|