JNI//JAVA本地址接口(JAVA NATIVE INTERFACE)
现在JVM运行字节码的速率已经接近本地编译代码,借助动态运行时优化,其表现甚至还有所超越。这就意味着,多数Java应用程序已不再受CPU的束缚(把大量时间用在执行代码上),而更多时候是受I/O的束缚(等待数据传输)。然而,在大多数情况下,Java应用程序并非真的受着I/O的束缚。操作系统并非不能快速传送数据,让Java有事可做;相反,是JVM自身在I/O方面效率欠佳。操作系统与Java基于流的I/O模型有些不匹配。操作系统要移动的是大块数据(缓冲区),这往往是在硬件直接存储器存取(DMA)的协助下完成的。而JVM的I/O类是小块小块操作的。NIO有了之后,可以把大块数据备份到可以直接使用的地方。(ByteBuffer对象)
缓冲区(buffer)的四个节点:0<mark<position<limit<capacity
0表示起点,cpapcity表示缓冲区总容量,mark表示标识位,position是当前位置,limit是上界
在Java中字符内部以Unicode表示,每个Unicode字符占16位。
byteBuffer.put((byte)‘H‘).put((byte)‘e‘).put((byte)‘l‘).put((byte)‘l‘).put((byte)‘o‘);
byteBuffer.put(0,(byte)‘M‘).put((byte)‘w‘);
这样绝对位置的0元素H将会被换成M,绝对位置的值改动不会影响到position的改变,累加的put才会让position+1
//翻转
byteBuffer.limit(byteBuffer.position()).position(0);//将当前位置设为上界,并把当前位置重新设置到0
byteBuffer.flip();//功能同上
byteBuffer.rewind();//只设置position到0,不去设置上界
BufferUnderflowException//越上界读
BufferOverflowException//越上界写
byteBuffer.hasRemaining()//判断是否到达缓冲区的上界
int count = byteBuffer.remaining()//position到limit的元素个数
缓冲区是非线程安全的。
byteBuffer.clear()//将缓冲区重置为空,不改变任何元素,只是将limit设置为capacity,将position设置为0
byteBuffer.compact()//压缩,将已经读数据清空。原理,将未读数据拷到0(从0开始),position设置为未读数据的最大索引,position之后就算还有数据,也是死数据,limit设为最大(capacity)
byteBuffer.reset()//返回到先前设定好的一个标志,如果之前没有mark()过,会抛InvalidMarkException异常,flip()/clear/rewind都会使mark失效
//缓冲区的创建
CharBuffer charBuffer = CharBuffer.allocate(100);//隐含地从堆空间分配一个char型数组作为备份存储器来存储100个char变量
char[] myArray = new char[100];//用自己定义的数据作为缓冲区的备份存储器
CharBuffer charBuffer = CharBuffer.warp(myArray);