将字符串写入套接字的输入流

时间:2013-05-01 14:54:20

标签: java string sockets outputstream

我正在开发一个适应服务器 - 客户端架构的项目。在客户端和服务器之间传输的消息是字符串和字节数组的组合。我需要预先发送整个邮件的大小。

找到字节数组的字节大小是微不足道的,但字符串却不是这样。显然,我可以将这些字符串转换为字节数组(考虑编码)。但是,这些字符串可能很长,我不想为它们的副本分配内存(例如getBytes()分配一个新数组)。

我的问题是,执行以下操作的内存效率最高的方法是什么?

  1. 查找字符串的字节大小(使用UTF-8编码)
  2. 将该大小写入输出流
  3. 将字符串写入输出流

3 个答案:

答案 0 :(得分:1)

按字符迭代字符串。为每个位置调用codePointAt()以获取其unicode代码点。根据代码点,您可以推断出以UTF-8编码时需要多少字节:

Codepoint range | UTF-8 bytes
-----------------------------
0     - 127     |  1
128   - 2047    |  2
2048  - 65535   |  3
65536 +         |  4

但是在你这样做之前,你应该首先验证这是否真的有必要。传递给套接字的String很可能在内部被复制到字节数组中。

答案 1 :(得分:1)

如果大小不是关键问题,请对字符串使用UTF16-BE编码。在这种情况下,大小将是字符串长度* 2.

在这种模式下,您可以逐个编写Java字符,而无需进行额外处理(Unicode高低代理等)。

答案 2 :(得分:0)

您总是可以在数据包中“中断”您的消息,因此您可以为消息的某些部分进行计算和内存分配,迭代到另一部分并再次执行此操作。