Java如何使用紧凑方法清除缓冲区?

如果要清除缓冲区但要将未读取的数据保留在缓冲区中,则需要使用compact()缓冲区的方法。该compact()方法会将未读数据复制到缓冲区的开头,并在未读数据之后立即设置位置。在limit本身仍然有值等于缓冲能力。缓冲区将准备好再次写入,而不会覆盖未读取的数据。

package org.nhooo.example.io;

import java.nio.CharBuffer;

public class BufferCompact {
    public static void main(String[] args) throws Exception {
        CharBuffer buffer = CharBuffer.allocate(64);
        buffer.put("Let's write some Java code! ");

        System.out.println("Position: " + buffer.position());
        System.out.println("Limit   : " + buffer.limit());

        // 从缓冲区读取10个字符。
        buffer.flip();
        for (int i = 0; i < 10; i++) {
            System.out.print(buffer.get());
        }
        System.out.println("");

        System.out.println("Position: " + buffer.position());
        System.out.println("Limit   : " + buffer.limit());

        // 使用compact()方法清除缓冲区。
        buffer.compact();
        System.out.println("Position: " + buffer.position());
        System.out.println("Limit   : " + buffer.limit());

        // 写入和读取更多数据。
        buffer.put("Add some more data.");

        buffer.flip();
        while (buffer.hasRemaining()) {
            System.out.print(buffer.get());
        }
    }
}

上面的代码片段的输出是:

Position: 28
Limit   : 64
Let's writ
Position: 10
Limit   : 28
Position: 18
Limit   : 64
e some Java code! Add some more data.