最近在看编程思想的时候一直对nio中的一些类的方法的运作方式感到十分疑惑,比如Channel.read(buffer),Channel.write(buffer),Buffer.get(),Buffer.put().
在翻阅源代码后发现Java的Buffer,CharBuffer源码中都看不到get(),put()方法的具体实现,这些方法都是抽象方法。当然其也有重载版本的具体实现,但是我想了解的那一部分却是抽象的。
于是根据编程思想P561的程序,对get()和put()的性质做个小总结:
一旦调用缓冲器上的get()和put()方法,position指针就会随之相应变化。
对于get()行为,根据代码结果可以得到(以CharBuffer为例):
get()方法返回当前postion所指的数组值,并将position值+1
对于put(char c)行为:
将当前position的值置为c,并将position值+1
关于clear()方法,书上对clear()的作用是这样解释的:
清空缓冲区,将position置0,limit置为capacity
在源码中我找到了对clear()的描述:
This method does not actually erase the data in the buffer, but it is named as if
it did because it will most often be used in situations in which that might as well
be the case.
所以调用clear()方法,缓冲区还是会有数据的,只不过之后读入缓冲区的数据会将旧值覆盖。