使用ByteBuffer处理byte []

时间:2011-01-13 21:07:43

标签: java string bytearray nio bytebuffer

我尝试通过ByteBuffer访问byte []以表​​示我定义的文件类型。 byte []中的第一个位置包含一些元数据,并通过位操作进行处理。所以他们根本不代表一个角色。

我想在某个固定位置添加文件数据(例如字符)。

byte[] file_portion包含大文件的一部分:开头部分。其中包括元数据的标头。 content是一个String,包含我想要添加到该缓冲区的信息。 start_pos是从内容中保存新文件数据的第一个位置。

ByteBuffer my_content = ByteBuffer.allocate(this.file_portion.length);
content_buffer.wrap(this.file_portion);

for (int i = 0; i < content.length(); i++) {
    char tmp = content.toCharArray()[i];
    my_content.put(this.start_pos + i, (byte) tmp)
}

如果我重新映射,我会得到垃圾和空虚:

CharBuffer debug = my_content.asCharBuffer();
System.out.println("debug " + debug);

我能理解,如果第一个位置显示损坏的字符......但是没有一个位置是正确的。

2 个答案:

答案 0 :(得分:2)

如果要将字符添加到ByteBuffer并希望它们可以通过CharBuffer视图读取,那么您应该使用putChar(...)而不是put(...)。

已编辑:根据OP评论。

例如:

char[] chars = content.toCharArray();  // removed from loop per leonbloy's excellent comment  
CharBuffer cbuf = my_content.asCharBuffer();

for (int i = 0; i < content.length(); i++) {
    cbuf.putChar(chars[i]);
}

CharBuffer debug = my_content.asCharBuffer();
System.out.println(debug);

my_content.position(my_content.position() + 2*chars.length);

否则,CharBuffer会将两个连续字节作为单个字符读取。 现在,cbuf缓冲区将开始在字节缓冲区停止的同一点加载字符。加载所有字符后,您的原始ByteBuffer将定位到下一个位置。希望这是你正在寻找的。

答案 1 :(得分:1)

您是否知道在Java中,char占用两个字节?