BufferOverFlowException 首先.put()
BufferOverFlowException at first .put()
由于之前没有翻转缓冲区,我遇到了问题,但现在我无法让缓冲区使用 .put() 或 .putInt() 添加任何东西,它在第一次尝试时不断抛出 BufferOverflowException的:
buffer.put((byte) c.getRed());
相关代码如下:
BufferedImage image = loadImage(".\res\" + fileName);
int[] pixels = new int[image.getWidth() * image.getHeight()];
image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth());
ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * 4);
buffer.flip();
Color c;
for (int y = 0; y < image.getHeight(); y++) {
for (int x = 0; x < image.getWidth(); x++) {
c = new Color(image.getRGB(x, y));
buffer.put((byte) c.getRed()); // Red component
buffer.put((byte) c.getGreen()); // Green component
buffer.put((byte) c.getBlue()); // Blue component
buffer.put((byte) c.getAlpha()); // Alpha component. Only for RGBA
}
}
您对 buffer.flip()
的调用打错了地方。来自 documentation:
Flips this buffer. The limit is set to the current position and then the position is set to zero.
其中limit定义为:
A buffer's limit is the index of the first element that should not be read or written. A buffer's limit is never negative and is never greater than its capacity.
由于您在分配缓冲区后立即调用 flip()
,当前位置为 0,因此 flip()
调用将限制设置为 0。这意味着无法在索引 0 处写入任何内容,或之后。这反过来意味着什么都不能写。
要解决此问题,您需要将 buffer.flip()
调用 移动到使用 buffer.put()
.[=20= 使用值填充缓冲区的循环之后 ]
您的原始代码缺失的要点是,在将数据写入缓冲区后,缓冲区位置需要设置为 0。否则,以后的操作将从当前位置开始读取,即完成所有 buffer.put()
操作后缓冲区的末尾。
在用数据填充缓冲区后,有多种方法可以将位置重置为 0。这些中的任何一个都应该完成这项工作:
buffer.flip();
buffer.position(0);
buffer.rewind();
由于之前没有翻转缓冲区,我遇到了问题,但现在我无法让缓冲区使用 .put() 或 .putInt() 添加任何东西,它在第一次尝试时不断抛出 BufferOverflowException的:
buffer.put((byte) c.getRed());
相关代码如下:
BufferedImage image = loadImage(".\res\" + fileName);
int[] pixels = new int[image.getWidth() * image.getHeight()];
image.getRGB(0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth());
ByteBuffer buffer = BufferUtils.createByteBuffer(image.getWidth() * image.getHeight() * 4);
buffer.flip();
Color c;
for (int y = 0; y < image.getHeight(); y++) {
for (int x = 0; x < image.getWidth(); x++) {
c = new Color(image.getRGB(x, y));
buffer.put((byte) c.getRed()); // Red component
buffer.put((byte) c.getGreen()); // Green component
buffer.put((byte) c.getBlue()); // Blue component
buffer.put((byte) c.getAlpha()); // Alpha component. Only for RGBA
}
}
您对 buffer.flip()
的调用打错了地方。来自 documentation:
Flips this buffer. The limit is set to the current position and then the position is set to zero.
其中limit定义为:
A buffer's limit is the index of the first element that should not be read or written. A buffer's limit is never negative and is never greater than its capacity.
由于您在分配缓冲区后立即调用 flip()
,当前位置为 0,因此 flip()
调用将限制设置为 0。这意味着无法在索引 0 处写入任何内容,或之后。这反过来意味着什么都不能写。
要解决此问题,您需要将 buffer.flip()
调用 移动到使用 buffer.put()
.[=20= 使用值填充缓冲区的循环之后 ]
您的原始代码缺失的要点是,在将数据写入缓冲区后,缓冲区位置需要设置为 0。否则,以后的操作将从当前位置开始读取,即完成所有 buffer.put()
操作后缓冲区的末尾。
在用数据填充缓冲区后,有多种方法可以将位置重置为 0。这些中的任何一个都应该完成这项工作:
buffer.flip();
buffer.position(0);
buffer.rewind();