在Java中,以字符形式"构建"和使用字符串的最快方法是什么?

Kun*_*nal 4 java string variables byte

我有一个间歇性地接收数据的Java套接字连接.每次突发接收的数据字节数不同.数据可以或可以不由众所周知的字符(例如CR或LF)终止.每个数据突发的长度是可变的.

我正在尝试从每个数据突发中构建一个字符串.构建一个稍后需要解析的字符串的最快方法(速度,而不是内存)是多少?

我开始使用字节数组来存储传入的字节,然后将它们转换为每个突发的字符串,如下所示:

byte[] message = new byte[1024];
...
message[i] = //byte from socket
i++;
...
String messageStr = new String(message);
...
//parse the string here
Run Code Online (Sandbox Code Playgroud)

这样做的明显缺点是一些突发可能比1024更长.我不想随意创建一个更大的字节数组(如果我的突发更大会怎么样?).

这样做的最佳方式是什么?我应该创建一个StringBuilder对象并追加它()吗?这样我就不必将StringBuilder转换为String(因为前者有我需要的大部分方法).

再次,执行速度是我最关心的问题.

TIA.

kdg*_*ory 12

我可能会使用InputStreamReader缠绕的a BufferedInputStream,然后包裹套接字.并编写一次处理消息的代码,可能会阻止输入.如果输入是突发性的,我可能会在后台线程上运行并使用并发队列来保存消息.

一次读取缓冲区并尝试将其转换为字符正是BufferedInputStream/InputStreamReader如此.并且它在关注编码的同时这样做(正如其他人所指出的那样)你的解决方案没有.

我不知道为什么你专注于速度,但是你会发现处理来自套接字的数据的时间远远少于通过该套接字传输的时间.


Bri*_*new 8

请注意,当您跨网络层传输时,转换速度可能不是瓶颈.如果您认为这很重要,那将值得衡量.

请注意(另外)您没有在从字节到字符串(通过字符)的转换中指定字符编码.我会以某种方式强制执行,否则如果/当您的客户端/服务器在不同的环境中运行时,您的客户端/服务器通信可能会损坏.您可以通过JVM运行时args强制执行该操作,但这不是一个特别安全的选项.

鉴于上述情况,您可能需要考虑使用StringBuilder(int capacity)以适当的大小预先配置它,这样它就不必动态重新分配.