用 ByteBuffer 处理 byte[]
Posted
技术标签:
【中文标题】用 ByteBuffer 处理 byte[]【英文标题】:Handle byte[] with ByteBuffer 【发布时间】:2011-01-13 21:07:43 【问题描述】:我尝试通过 ByteBuffer 访问 byte[] 以表示我定义的文件类型。 byte[] 中的第一个位置包含一些元数据并使用位操作进行处理。所以它们根本不代表字符。
我想在某个固定位置添加文件数据(例如字符)。
byte[] file_portion
包含一个大文件的一部分:开始部分。其中包括带有元数据的标头。
content
是一个字符串,其中包含我要添加到该缓冲区的信息。 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);
如果第一个位置显示损坏的字符,我可以理解...但没有一个位置是正确的。
【问题讨论】:
除了错误,content.toCharArray()[i]
很丑,你在每次循环迭代中分配一个新的 char 数组。在外面构建char数组,或者使用content.charAt(i)
【参考方案1】:
如果您将字符添加到 ByteBuffer 并希望它们可以通过 CharBuffer 视图读取,则应该使用 putChar(...) 而不是 put(...)。
已编辑:每个 OP cmets。
例如:
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 将被定位到下一个位置。希望这就是您正在寻找的。p>
【讨论】:
那个 .flip() 看起来很有用。但我仍然必须在特定位置添加字符。如果我用 my_content.setPosition(this.start_pos+i) 甚至 + i +1 这样做,整个转换就会被破坏。 我想我想说的是,你需要让缓冲区为你做两件事,让你的生活更轻松。 1) 管理缓冲区中的位置和 2) 管理正在读/写的项目的数据格式。在您的原始代码中,您尝试同时执行这两种操作,并因此遇到问题。 非常感谢您的努力。你是绝对正确的:在这里管理职位是有问题的,我必须把它分开。我仍然有从位置 0 填充 cbuf 的问题。我需要从位置 n 开始填充它。每次我这样做时,整个东西都会被破坏。 :( @wishi 我想我需要更多地了解您正在做的事情的上下文,以提出解决您问题的代码。 终于明白了...感谢您的帮助。 CharBuffer 有我需要的 .put(index, char) 。非常感谢!!【参考方案2】:你知道在 Java 中一个 char 占用两个字节吗?
【讨论】:
以上是关于用 ByteBuffer 处理 byte[]的主要内容,如果未能解决你的问题,请参考以下文章
从 ByteBuffer 获取到 byte[] 不写入到 byte[]
java 中 byte[]FileInputStream 互相转换