NIO学习笔记(四)CharBuffer类API的使用
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());
}
}