之前听别人说java nio,以为是封装的多线程处理io,提高并发能力,支持批量下载,今天了解才发现是java new io.
主要包括3个核心 : buffer(走缓冲),selector(选择器,将IO阻塞调整为选择阻塞,这样网络请求就不至于阻塞,只是后台任务堆积),channel(通道)
先学习Buffer.
Buffer主要是几个基本类型的Buffer,例如intBuffer,ByteBuffer等,今天以IntBuffer实现各个方法的说明,和各个可能碰到的坑点的碰撞。
package javaNioTest;
import java.nio.IntBuffer;
import java.util.HashMap;
import java.util.Map;
public class BufferStudy {
public static void main(String args[]) {
IntBuffer intBuffer = IntBuffer.allocate(8);
System.out.println("初始intBuffer的限制为:" + intBuffer.limit());
for (int i = 1; i < intBuffer.capacity(); i++) {
System.out.println("当前位置至limit中的元素数量:" + intBuffer.remaining());
intBuffer.put(i);
}
intBuffer.flip();
for (int i = 1; i <= intBuffer.limit(); i++) {
System.out.println("当前数组偏移量:" + intBuffer.arrayOffset() + "\t第" + i + "个值为" + intBuffer.get());
}
intBuffer.limit(5);
System.out.println("将limit置为5后的限制值:" + intBuffer.limit());
// 当偏移量大于limit后我们看下获取的元素数量和下一个值会是多少
System.out.println("position=7,limit=5时,remaining()返回值:" + intBuffer.remaining());
// System.out.println("position=7,limit=5时,读取下一个值:" + intBuffer.get());异常了
System.out.println("position=7,limit=5时,读取返回值:" + intBuffer.get(3));
intBuffer.limit(5);
intBuffer.clear(); // position \ limit \ capacity 恢复初始化,值还存在
System.out.println("原来位置为7,clear后intbuffer的position为:" + intBuffer.position());
System.out.println("原来限制为5,clear后intbuffer的限制为:" + intBuffer.limit());
System.out.println("clear后intbuffe的还有值吗?" + intBuffer.hasRemaining());
while (intBuffer.hasRemaining()) {
System.out.println("clear后值:" + intBuffer.get());
}
// 测试rewind();
intBuffer.clear();
intBuffer.position(2);
int p1 = intBuffer.position();
intBuffer.limit(5);
intBuffer.rewind();
System.out.println("原来位置为" + p1 + ",rewind后intbuffer的position为:" + intBuffer.position());
System.out.println("原来限制为5,rewind后intbuffer的限制为:" + intBuffer.limit());
System.out.println("rewind后intbuffe的还有值吗?" + intBuffer.hasRemaining());
while (intBuffer.hasRemaining()) {
System.out.println("rewind后值:" + intBuffer.get());
}
// 测试flip()
intBuffer.clear();
intBuffer.get(2);
int p2 = intBuffer.position();
System.out.println(p2 + "/t当前位置值:" + intBuffer.get());
intBuffer.position(2);
int p3 = intBuffer.position();
intBuffer.limit(5);
intBuffer.flip();
System.out.println("原来位置为" + p3 + ",flip后intbuffer的position为:" + intBuffer.position());
System.out.println("原来限制为5,flip后intbuffer的限制为:" + intBuffer.limit());
System.out.println("flip后intbuffe的还有值吗?" + intBuffer.hasRemaining());
while (intBuffer.hasRemaining()) {
System.out.println("flip后值:" + intBuffer.get());
}
// 测试Map.clear
Map<String, String> sa = new HashMap<String, String>();
sa.put("sd", null);
sa.clear();
System.out.println(sa.size());
}
/**
* 结论 :
* 1、第13行输出说明, buffer.remaining()返回的是limit-position的值,包含当前位置的值,但不代表自己存放进去的值的个数
* 2、第24行抛出异常说明, 读取值得时候position不能大于limit
* 3、第25行输出说明, intBuffer.get(index),index是从0开始的,同时介绍说明 index<limit才不会异常
* 4、第30行输出说明, 对于intBuffer,如果我们没有放入值,那么获取到的不是null,而是0
* 5、第28、29、30、32说明, buffer.clear() 将position置为0,limit置为容量大小,但是值还存在。 (初始化)
* 6、第40、41、42行说明, buffer.rewind() 将position置0,limit不变,capacity不变 (重读)
* 7、第56、57、58行说明, buffer.flip() 将position置0,limit置为之前position位置-1(取之前position前面区域,不包括position)
* 8、第49、50、51行说明, buffer.get(index),会取出position=index的值,当时position不会改变
*/
}