NIO学习笔记(四)CharBuffer类API的使用

    技术2022-07-10  137

    NIO学习笔记(四)CharBuffer类API的使用

    NIO学习笔记(四)CharBuffer类API的使用1、重载append(char)/append(CharSequence)/append(CharSequence,start,end)方法的使用2、读取相对于当前位置的给定索引处的字符3、put(String src)、int read(CharBuffer target) 和subSequence(int start , int end)方法的使用4、static CharBuffer wrap(CharSequence csq , int start , int end)方法的使用5、获得字符型缓冲区的长度

    NIO学习笔记(四)CharBuffer类API的使用

    CharBuffer 类提供一个字符(char)序列缓冲区。由于之前大量的API已经在ByteBuffer里面讲过了,这里不做过多的赘述。

    1、重载append(char)/append(CharSequence)/append(CharSequence,start,end)方法的使用

    public CharBuffer append(char c)方法的作用:将指定字符添加到此缓冲区(可选操作)。调用此方法的形式为dst.append©,该调用与以下调用完全相同dst.put©。

    public CharBuffer append(CharSequence csq)方法的作用,将指定的字符序列添加到此缓冲区。调用此方法的形式为dst.append(csq),该调用与以下调用完全相同:dst.put(csq.tosString()),有可能没有添加整个序列,这取决于针对字符序列csq的toString规范。例如,调用字符缓冲区的toString()方法将返回一个子序列,其内容取决于缓冲区的位置和限制。

    public CharBuffer append(CharSequence csq , int start , int end)方法作用:将指定字符序列的子序列添加到此缓冲区。当csq不为null的时候,调用此方法的形式为dst.append(csq,start,end),调用与以下调用完全相同:dst.put(csq.subSequence(start,end).toString)。

    示例代码:

    public class AppendDemo { public static void main(String[] args) { CharBuffer buffer = CharBuffer.allocate(15); System.out.println("A position = "+buffer.position()); buffer.append('a'); System.out.println("B position = "+buffer.position()); buffer.append("bcdef"); System.out.println("C position = "+buffer.position()); buffer.append("abcuhwief",3,8); System.out.println("D position = "+buffer.position()); System.out.println(Arrays.toString(buffer.array())); System.out.println("E capacity = "+buffer.capacity()); } }

    2、读取相对于当前位置的给定索引处的字符

    public final char charAt(int index)方法的作用:读取相对于当前位置的给定索引处的字符:

    示例代码:

    public class CharAtDemo { public static void main(String[] args) { CharBuffer buffer = CharBuffer.allocate(15); buffer.append("auegwvl"); buffer.position(2); System.out.println(buffer.charAt(0)); System.out.println(buffer.charAt(1)); System.out.println(buffer.charAt(2)); } }

    3、put(String src)、int read(CharBuffer target) 和subSequence(int start , int end)方法的使用

    put(String src)方法的作用:相对批量的put方法。此方法将给定的源字符串中的所有内容传输到此缓冲区的当前位置。调用此方法的形式为dst.put(s),该调用与以下调用完全相同:dst.put(s,0,s.length)。**int read(CharBuffer target)**方法的作用:试图将当前字符缓冲区中的字符写入指定的字符缓冲区。缓冲区可照原样用作字符的存储库:所做的唯一更改是put操作的结果,不对缓冲区执行翻转和重绕操作。subSequence(int start, int end) 方法的作用:创建表示此缓冲区的指定序列、相对于当前位置的新字符缓冲区。新缓冲区将共享此缓冲区的内容,即如果此缓冲区的内容是可变的。则修改一个缓冲区将导致另一个缓冲区被修改。新缓冲区的容量为当前,缓冲区的容量。其位置将为position+start,其限制将为position+end。当且仅当此缓冲区为直接缓冲区时,新缓冲区才为直接缓冲区。当且仅当此缓冲区为只读缓冲区,新缓冲区才为只读缓冲区。其中两个参数: 1. start:子序列中的第一个字符相对于当前位置的索引:必须为非负且不大于remaining()。 2. end:子序列中最后一个字符相对于当前位置的索引;必须不小于start且不大于remaining()。

    示例代码:

    public class PrsDemo { public static void main(String[] args) throws IOException { CharBuffer buffer = CharBuffer.allocate(8); buffer.append("av123456"); buffer.position(2); buffer.put("cde"); buffer.rewind(); System.out.println(Arrays.toString(buffer.array())); buffer.position(1); CharBuffer buffer2 = CharBuffer.allocate(4); System.out.println("buffer2 position = "+buffer2.position()); buffer.read(buffer2); System.out.println("buffer2 position = "+buffer2.position()); buffer2.rewind(); System.out.println(Arrays.toString(buffer2.array())); System.out.println(Arrays.toString(buffer.array())); buffer.position(2); CharBuffer buffer3 = buffer.subSequence(0, 2); System.out.println("buffer3 capacity = " + buffer3.capacity() + " limit="+buffer3.limit()+" position="+buffer3.position()); System.out.println(Arrays.toString(buffer3.array())); } }

    4、static CharBuffer wrap(CharSequence csq , int start , int end)方法的使用

    static CharBuffer wrap(CharSequence csq , int start , int end)方法的作用:将字符序列包装到缓冲区中。新的只读缓冲区的内容将为给定字符序列的内容。缓冲区的容量将为csq.length,其位置将为start,限制为end,标记未定义。参数解释:

    1. 参数csq代表字符序列,新的字符缓冲区将从中创建 2. 参数start代表第一个要使用的字符索引,必须为非负且不大于csq.length,新缓冲区的位置将被设置为start 3. 参数end代表最后一个要使用的字符索引,必须不小于start且不大于csq.length,新缓冲区的位置将被设置为end

    示例代码:

    public class CharBufferWrapDemo { public static void main(String[] args) { CharBuffer charBuffer = CharBuffer.wrap("abcdefg", 3, 5); System.out.println("charBuffer capacity = " + charBuffer.capacity() + " limit="+charBuffer.limit()+" position="+charBuffer.position()); for (int i = 0; i < charBuffer.limit(); i++) { System.out.print(charBuffer.get(i)+" "); } charBuffer.append("我是只读的,不能添加数据,会出现异常"); } }

    5、获得字符型缓冲区的长度

    public final int length()方法的作用:返回此缓冲区的长度。当字符型缓冲区视为字符序列时,长度只是该位置和限制之间的字符数,即长度等效于remaining()

    示例代码:

    public class LengthDemo { public static void main(String[] args) { CharBuffer buffer = CharBuffer.wrap("abcd"); System.out.println("position = " + buffer.position() + " remaining = " + buffer.remaining() + " length = " + buffer.length()); System.out.println(buffer.get()); System.out.println("position = " + buffer.position() + " remaining = " + buffer.remaining() + " length = " + buffer.length()); System.out.println(buffer.get()); System.out.println("position = " + buffer.position() + " remaining = " + buffer.remaining() + " length = " + buffer.length()); System.out.println(buffer.get()); System.out.println("position = " + buffer.position() + " remaining = " + buffer.remaining() + "length = " + buffer.length()); System.out.println(buffer.get()); System.out.println("position = " + buffer.position() + " remaining = " + buffer.remaining() + " length = " + buffer.length()); } }
    Processed: 0.009, SQL: 12