package com.suns.Netty02Copy; import java.nio.ByteBuffer; public class Test { public static void main(String[] args) { ByteBuffer byteBuffer = ByteBuffer.allocate(10); byteBuffer.put(new byte[]{'a','b','c','d'}); byteBuffer.clear(); System.out.println("byteBuffer.limit() = " + byteBuffer.limit()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + " byteBuffer.position()=" +byteBuffer.position()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + " byteBuffer.position()=" +byteBuffer.position()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + " byteBuffer.position()=" +byteBuffer.position()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + " byteBuffer.position()=" +byteBuffer.position()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + " byteBuffer.position()=" +byteBuffer.position()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + " byteBuffer.position()=" +byteBuffer.position()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + " byteBuffer.position()=" +byteBuffer.position()); byteBuffer.put(new byte[]{'e'}); byteBuffer.put(new byte[]{'f'}); byteBuffer.flip(); System.out.println("byteBuffer.limit() = " + byteBuffer.limit()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + " byteBuffer.position()=" +byteBuffer.position()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + " byteBuffer.position()=" +byteBuffer.position()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + " byteBuffer.position()=" +byteBuffer.position()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + " byteBuffer.position()=" +byteBuffer.position()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + " byteBuffer.position()=" +byteBuffer.position()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + " byteBuffer.position()=" +byteBuffer.position()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + " byteBuffer.position()=" +byteBuffer.position()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + " byteBuffer.position()=" +byteBuffer.position()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + " byteBuffer.position()=" +byteBuffer.position()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + " byteBuffer.position()=" +byteBuffer.position()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + " byteBuffer.position()=" +byteBuffer.position()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get() + " byteBuffer.position()=" +byteBuffer.position()); //byteBuffer.limit() = 10 //byteBuffer.get() = a byteBuffer.position()=1 //byteBuffer.get() = b byteBuffer.position()=2 //byteBuffer.get() = c byteBuffer.position()=3 //byteBuffer.get() = d byteBuffer.position()=4 //byteBuffer.get() = byteBuffer.position()=5 //byteBuffer.get() = byteBuffer.position()=6 //byteBuffer.get() = byteBuffer.position()=7 //byteBuffer.limit() = 9 //byteBuffer.get() = a byteBuffer.position()=1 //byteBuffer.get() = b byteBuffer.position()=2 //byteBuffer.get() = c byteBuffer.position()=3 //byteBuffer.get() = d byteBuffer.position()=4 //byteBuffer.get() = byteBuffer.position()=5 //byteBuffer.get() = byteBuffer.position()=6 //byteBuffer.get() = byteBuffer.position()=7 //byteBuffer.get() = e byteBuffer.position()=8 //byteBuffer.get() = f byteBuffer.position()=9 //Exception in thread "main" java.nio.BufferUnderflowException // at java.nio.Buffer.nextGetIndex(Buffer.java:500) // at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:135) // at com.suns.Netty02Copy.Test.main(Test.java:39) // //Process finished with exit code 1 } }
1:执行完Clear方法之后,对应的模式是写模式,写模式我们依旧可以去执行get方法,所谓的写模式仅仅是capacity和position和limit的三个指标的模型而已。
2:get方法不受Buffer读写模式的影响,执行一个get方法就一定会让position向右挪移一位,当我们的position已经和我们limit是一致的时候,就会抛出来一个 java.nio.BufferUnderflowException异常。
3:也就是说,我们的position不能超过limit。这一点我们使用下面的代码来演示证明。
package com.suns.Netty02Copy; import java.nio.ByteBuffer; public class Test { public static void main(String[] args) { ByteBuffer byteBuffer = ByteBuffer.allocate(10); byteBuffer.put(new byte[]{'a','b','c','d'}); //这里是写模式,我们接下来转换为读模式。 System.out.println("byteBuffer.get() = " + byteBuffer.get()); System.out.println("byteBuffer.get() = " + byteBuffer.get()); System.out.println("byteBuffer.get() = " + byteBuffer.get()); System.out.println("byteBuffer.get() = " + byteBuffer.get()); System.out.println("byteBuffer.get() = " + byteBuffer.get()); System.out.println("byteBuffer.get() = " + byteBuffer.get()); System.out.println("-------------------------------------------------"); System.out.println(byteBuffer.position() + "-----------" + byteBuffer.limit()); //这里limit是跟capacity相等了,说明position和limit和capacity的关系永远只能是:position < limit < capacity System.out.println("byteBuffer.get() = " + byteBuffer.get()); System.out.println("byteBuffer.get() = " + byteBuffer.get()); System.out.println("byteBuffer.get() = " + byteBuffer.get()); System.out.println("byteBuffer.get() = " + byteBuffer.get()); System.out.println("byteBuffer.get() = " + byteBuffer.get()); System.out.println("byteBuffer.get() = " + byteBuffer.get()); System.out.println("byteBuffer.get() = " + byteBuffer.get()); System.out.println("byteBuffer.get() = " + byteBuffer.get()); System.out.println("byteBuffer.get() = " + byteBuffer.get()); } } //byteBuffer.get() = 0 //byteBuffer.get() = 0 //byteBuffer.get() = 0 //byteBuffer.get() = 0 //byteBuffer.get() = 0 //byteBuffer.get() = 0 //------------------------------------------------- //1010 //Exception in thread "main" java.nio.BufferUnderflowException // at java.nio.Buffer.nextGetIndex(Buffer.java:500) // at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:135) // at com.suns.Netty02Copy.Test.main(Test.java:19) // //Process finished with exit code 1
当然以上的情况,我们的limit和capacity相等了,所以这个说服力不是很强
package com.suns.Netty02Copy; import com.sun.media.sound.SoftTuning; import java.nio.ByteBuffer; public class Test { public static void main(String[] args) { ByteBuffer byteBuffer = ByteBuffer.allocate(10); byteBuffer.put(new byte[]{'a','b','c','d'}); //这里是写模式,我们接下来转换为读模式。 byteBuffer.flip(); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get()); System.out.println("byteBuffer.get() = " + (char)byteBuffer.get()); } //byteBuffer.get() = a //byteBuffer.get() = b //byteBuffer.get() = c //byteBuffer.get() = d //Exception in thread "main" java.nio.BufferUnderflowException // at java.nio.Buffer.nextGetIndex(Buffer.java:500) // at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:135) // at com.suns.Netty02Copy.Test.main(Test.java:18) }
这里可以说明:get一次position向右移动一次,如果position > limit 就会报错:BufferUnderflowException