java nio 中 bytebuffer 的 put() 方法用于将数据写入缓冲区,其核心机制是自动更新 position 指针并检查容量。调用时直接传入目标数据即可,若空间不足会抛出 bufferoverflowexception。操作完成后,若需读取数据,必须调用 flip() 切换模式。

put() 遇到空输入或越界时会返回什么
put() 在遇到空输入或越界时不会返回特殊值,而是直接抛出异常。对于数组或字节序列,若长度超过剩余容量,抛出 BufferOverflowException;若源为 null,抛出 NullPointerException。该方法无返回值(void),仅通过修改缓冲区状态来工作。

import java.nio.ByteBuffer;
public class Main {
public static void main(String[] args) {
ByteBuffer buffer = ByteBuffer.allocate(10);
try {
// 尝试放入超出容量的数据
byte[] data = new byte[20];
buffer.put(data);
} catch (BufferOverflowException e) {
System.out.println("溢出异常: " + e.getMessage());
}
try {
// 尝试放入 null
buffer.put((byte[]) null);
} catch (NullPointerException e) {
System.out.println("空指针异常: " + e.getMessage());
}
}
}
put() 在不同模式下行为有何差异
put() 在 READ 和 WRITE 模式下行为不同。在 WRITE 模式(默认)下,它从当前 position 开始写入并增加 position;在 READ 模式下,若尝试写入,通常会导致逻辑错误或需先 clear()。此外,put(int index, byte b) 绝对索引方法不改变 position,而相对方法会改变。
立即学习“Java免费学习笔记(深入)”;

import java.nio.ByteBuffer;
public class Main {
public static void main(String[] args) {
ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.put((byte) 'A');
buffer.put((byte) 'B');
// 切换到 READ 模式
buffer.flip();
// 尝试在 READ 模式下使用相对 put
try {
buffer.put((byte) 'C'); // 这会覆盖 'A' 的位置吗?不,它会从 position=0 开始写,但通常我们不会这样做
// 更常见的场景是:在 WRITE 模式下使用绝对 put
buffer.position(0);
buffer.put(0, (byte) 'X'); // 绝对索引,不改变 position
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Position after absolute put: " + buffer.position()); // 仍为 0
}
}
基于程序中某个输入、条件或结果的具体问题
当使用 put(byte[] src) 且源数组长度小于缓冲区剩余容量时,position 会增加源数组的长度,而 limit 保持不变。这意味着后续写入将继续从新 position 开始,而非从 limit 开始。这种行为可能导致数据被意外覆盖或留有空洞,需开发者手动管理 position 或使用 compact()。


















