Java – ByteBuffer.remaining()问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java – ByteBuffer.remaining()问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2493字,纯文字阅读大概需要4分钟。
内容图文
![Java – ByteBuffer.remaining()问题](/upload/InfoBanner/zyjiaocheng/757/5cc1bb3eaae14d60b4e1d5823f947472.jpg)
简介:我有一个ByteBuffer,我在其中提取一些数据.之后,我想通过Socket发送这些数据.
所以,我写了这样的代码:
private static void serialize(ByteBuffer buffer, EmployeeData emp, CharsetEncoder encoder)
{
// id
buffer.putInt(emp.getId());
CharBuffer nameBuffer = CharBuffer.wrap(emp.getFirstName().toCharArray());
ByteBuffer nbBuffer = null;
// length of first name
try
{
nbBuffer = encoder.encode(nameBuffer);
}
catch(CharacterCodingException e)
{
throw new ArithmeticException();
}
System.out.println(String.format("String [%1$s] #bytes = %2$s", emp.getFirstName(), nbBuffer.limit()));
buffer.putInt(nbBuffer.limit());
buffer.put(nbBuffer);
// put lastname
nameBuffer = CharBuffer.wrap(emp.getLastName().toCharArray());
nbBuffer = null;
// length of first name
try
{
nbBuffer = encoder.encode(nameBuffer);
}
catch(CharacterCodingException e)
{
throw new ArithmeticException();
}
System.out.println(String.format("String [%1$s] #bytes = %2$s", emp.getLastName(), nbBuffer.limit()));
buffer.putInt(nbBuffer.limit());
buffer.put(nbBuffer);
// salary
buffer.putInt(emp.getSalary());
}
在调用代码中,我执行以下操作.我首先得到序列化的ByteBuffer,然后将其写入套接字……
Socket client = new Socket("localhost", 8080);
OutputStream oStream = client.getOutputStream();
serialize(buffer, emp, encoder);
buffer.rewind();
while(buffer.hasRemaining())
{
byte temp = buffer.get();
++ written;
}
buffer.rewind();
System.out.println("#Bytes in output buffer: " + written + " limit = " + buffer.limit() + " pos = " + buffer.position() + " remaining = " + buffer.remaining());
int remaining = buffer.remaining();
while(remaining > 0)
{
oStream.write(buffer.get());
-- remaining;
}
我期望buffer.remaining()应该完全等于我输入缓冲区的#bytes.但是我发现它不是,它总是等于1024,这是缓冲区底层数组的大小.
这就是我创建缓冲区的方法……
Charset charset = Charset.forName("UTF-8");
CharsetDecoder decoder = charset.newDecoder();
CharsetEncoder encoder = charset.newEncoder();
byte [] underlyingBuffer = new byte[1024];
ByteBuffer buffer = ByteBuffer.wrap(underlyingBuffer);
buffer.order(ByteOrder.LITTLE_ENDIAN);
这就是我得到的print语句输出…
String [John] #bytes = 4 String [Smith] #bytes = 5
#Bytes in output buffer: 1024 limit = 1024 pos = 0 remaining = 1024
如何获得放入缓冲区的确切#bytes?
谢谢!
解决方法:
当你完成将字节放入缓冲区时,你应该flip它.您可以这样做,而不是第一次回拨.
java.nio.Buffer区分容量和限制.如果不翻转它,则limit和capacity与初始化它的数组的长度相同.
通过翻转它,限制将设置为您编码的数据的末尾,容量仍然是1024. ByteBuffer#remaining查看位置和限制之间的差值.
内容总结
以上是互联网集市为您收集整理的Java – ByteBuffer.remaining()问题全部内容,希望文章能够帮你解决Java – ByteBuffer.remaining()问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。