import java.nio.ByteBuffer; //Listing 7-1. Copying Bytes from an Input Channel to an Output Channel public class ty { public static void main(String[] args) { ty t = new ty(); ByteBuffer buffer = t.returnbb(); System.out.println(buffer); //// 之所以调用ByteBuffer.flip()方法是因为在向ByteBuffer写入数据后, //// position为缓冲区中刚刚读入的数据的最后一个字节的位置, //// flip方法将limit值置为position值,position置0, //// 这样在调用get*()方法从ByteBuffer中取数据时就可以取到ByteBuffer中的有效数据 //当读取时 从头开始,到limit处 buffer.flip(); while (buffer.hasRemaining()) { System.out.println((char) buffer.get()); } buffer.flip(); System.out.println("---------------------"); //取出 一个元素 System.out.println((char) buffer.get()); System.out.println("---------------------"); // clear()与compact()方法 // 一旦读完Buffer中的数据,需要让Buffer准备好再次被写入。 // 可以通过clear()或compact()方法来完成。 // 如果调用的是clear()方法,position将被设回0,limit被设置成capacity的值。 // 换句话说,Buffer 被清空了。Buffer中的数据并未清除, // 只是这些标记告诉我们可以从哪里开始往Buffer里写数据。 // 如果Buffer中有一些未读的数据,调用clear()方法,数据将“被遗忘”, // 意味着不再有任何标记会告诉你哪些数据被读过,哪些还没有。 // 如果Buffer中仍有未读的数据,且后续还需要这些数据,但是此时想要先先写些数据, // 那么使用compact()方法。 // compact()方法将所有未读的数据拷贝到Buffer起始处。 // 然后将position设到最后一个未读元素正后面。limit属性依然像clear()方法一样, // 设置成capacity。现在Buffer准备好写数据了,但是不会覆盖未读的数据 //保留剩余元素 并添加新元素 buffer.compact(); System.out.println(buffer); buffer.put((byte)'m'); buffer.flip(); while (buffer.hasRemaining()) { System.out.println((char) buffer.get()); } } public ByteBuffer returnbb() { ByteBuffer buffer = ByteBuffer.allocate(10); buffer.put((byte) 'H').put((byte) 'e').put((byte) 'l').put((byte) 'l') .put((byte) 'o'); buffer.put((byte) 'A'); return buffer; } }
output :
java.nio.HeapByteBuffer[pos=6 lim=10 cap=10] H e l l o A --------------------- H --------------------- java.nio.HeapByteBuffer[pos=5 lim=10 cap=10] e l l o A m