java - 将字符串写入套接字的输出流

标签 java string sockets outputstream

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

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

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

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

最佳答案

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

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

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

关于java - 将字符串写入套接字的输出流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16320505/

相关文章:

java - 使用回车键在java中激活一个按钮

c - strncmp 比 strcmp 快吗

c - 从 poll() 添加/删除套接字描述符

java - 一对多查询jpql

java - 为什么我在 Cloudinary Java 上收到 'Invalid Signature' 错误?

java - 编码 bat 字符串挑战未通过测试

c - 要求 Telnet 服务器忽略命令

php - 套接字关闭时间太长

java - 获取给定半径(米)和位置的最大经纬度

ruby-on-rails - 我正在尝试解析一些表格,它们有一些奇怪的类似字母表的非 ascii 字符