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

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)方法的使用

  1. put(String src)方法的作用:相对批量的put方法。此方法将给定的源字符串中的所有内容传输到此缓冲区的当前位置。调用此方法的形式为dst.put(s),该调用与以下调用完全相同:dst.put(s,0,s.length)。
  2. **int read(CharBuffer target)**方法的作用:试图将当前字符缓冲区中的字符写入指定的字符缓冲区。缓冲区可照原样用作字符的存储库:所做的唯一更改是put操作的结果,不对缓冲区执行翻转和重绕操作。
  3. 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());

    }
}

你可能感兴趣的:(NIO)