java Channel filp compact

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
原文地址:https://www.cnblogs.com/rojas/p/5415716.html