为什么我要使用java.nio.BufferUnderflowException

时间:2014-11-20 16:01:12

标签: java bytebuffer bufferunderflowexception

我从以下代码中获取BufferUnderflowException。

int length = mBuf.remaining();
char[] charBuff = new char[length];

for (int i = 0; i < length; ++i) {
   char[i] = mBuf.getChar();
}

mBuf是一个ByteBuffer。行“char [i] = mBuf.getChar();”坠毁了。

您如何看待这个问题?

1 个答案:

答案 0 :(得分:1)

您错误地认为char的大小是一个字节。在Java中,char是两个字节,因此mBuf.getChar()消耗两个字节。 documentation偶数表示该方法读取接下来的两个字节。

如果你使用mBuf.asCharBuffer()返回的CharBuffer,那个缓冲区的remaining()方法会给你你期望的数字。

更新:根据您的评论,我现在明白您的缓冲区实际上包含一个字节的字符。由于Java处理整个Unicode指令表(包含数十万个字符),因此您必须告诉它您正在使用哪种字符集(字符到字节编码):

// This is a pretty common one-byte charset.
Charset charset = StandardCharsets.ISO_8859_1;

// This is another common one-byte charset.  You must use the same charset
// that was used to write the bytes in your ObjectiveC program.
//Charset charset = Charset.forName("windows-1252");

CharBuffer c = charset.newDecoder().decode(mBuf);
char[] charBuff = new char[c.remaining()];
c.get(charBuff);