java bytebuffer 大小_Java - ByteBuffer.remaining()问题

简介:我有一个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?

谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值