针对更大的字符串优化 Java 中的本机消息主机
Optimize Native Message Host in Java for larger Strings
我正在使用 Chrome 的本地消息传递 API 将数据传递到 Java 中的主机。数据是以 Base64 编码的 512 KB 长字符串。问题是主机从标准输入读取数据的时间太长了。
我阅读了以下内容 post:Very Slow to pass "large" amount of data from Chrome Extension to Host (written in C#) 并且我知道问题在于我如何读取字节,但到目前为止我无法将该代码调整为 java。
我的主机代码是:
try {
// hilo principal de la aplicacion
while(true){
int length = 0;
String input = "";
String output = "";
String outputType = "";
// cargamos la logitud de caracteres en bytes
byte[] bytes = new byte[4];
System.in.read(bytes, 0, 4);
length = getInt(bytes);
// cargamos los datos enviados
byte[] data = new byte[length];
System.in.read(data, 0, length);
if (length == 0){
// si no recibimos datos ponemos un sleep para no comer todos los recursos del equipo
Thread.sleep(50);
break;
}else{
// Loop getchar to pull in the message until we reach the total length provided.
for (int i=0; i < length; i++){
input += (char) data[i];
}
// leemos el texto enviado del dato en JSON
JSONObject obj = new JSONObject(input);
String texto = obj.getString("text");
System.err.write(("TEXT: " + texto).getBytes());
// creamos el mensaje de respuesta y lo enviamos
String respuesta = "{\"type\":\"TEST\", \"text\":\"" + texto + "\"}";
System.out.write(getBytes(respuesta.length()));
System.out.write(respuesta.getBytes(Charset.forName("UTF-8")));
}
}
} catch (Exception e) {
e.printStackTrace();
}
我需要帮助调整 java 中主机的代码,以便快速阅读消息。
- 您可以使用
DataInputStream.readInt()
和 .readFully()
完成大部分工作,而且不会出现错误。如果您使用的是 Intel,则需要为本机字节顺序重新排列 int,因为这会读取网络字节顺序。
- 在
BufferedInputStream
和 System.in
之间添加一个 BufferedInputStream
:这将解决主要的性能问题。
- 通过
new String(data,...)
而不是附加循环解决其他性能问题。
- 很难理解为什么他们会向您发送零长度,但如果他们发送给您,除了浪费时间外,睡觉什么也做不了。删除那个。
我正在使用 Chrome 的本地消息传递 API 将数据传递到 Java 中的主机。数据是以 Base64 编码的 512 KB 长字符串。问题是主机从标准输入读取数据的时间太长了。 我阅读了以下内容 post:Very Slow to pass "large" amount of data from Chrome Extension to Host (written in C#) 并且我知道问题在于我如何读取字节,但到目前为止我无法将该代码调整为 java。
我的主机代码是:
try {
// hilo principal de la aplicacion
while(true){
int length = 0;
String input = "";
String output = "";
String outputType = "";
// cargamos la logitud de caracteres en bytes
byte[] bytes = new byte[4];
System.in.read(bytes, 0, 4);
length = getInt(bytes);
// cargamos los datos enviados
byte[] data = new byte[length];
System.in.read(data, 0, length);
if (length == 0){
// si no recibimos datos ponemos un sleep para no comer todos los recursos del equipo
Thread.sleep(50);
break;
}else{
// Loop getchar to pull in the message until we reach the total length provided.
for (int i=0; i < length; i++){
input += (char) data[i];
}
// leemos el texto enviado del dato en JSON
JSONObject obj = new JSONObject(input);
String texto = obj.getString("text");
System.err.write(("TEXT: " + texto).getBytes());
// creamos el mensaje de respuesta y lo enviamos
String respuesta = "{\"type\":\"TEST\", \"text\":\"" + texto + "\"}";
System.out.write(getBytes(respuesta.length()));
System.out.write(respuesta.getBytes(Charset.forName("UTF-8")));
}
}
} catch (Exception e) {
e.printStackTrace();
}
我需要帮助调整 java 中主机的代码,以便快速阅读消息。
- 您可以使用
DataInputStream.readInt()
和.readFully()
完成大部分工作,而且不会出现错误。如果您使用的是 Intel,则需要为本机字节顺序重新排列 int,因为这会读取网络字节顺序。 - 在
BufferedInputStream
和System.in
之间添加一个BufferedInputStream
:这将解决主要的性能问题。 - 通过
new String(data,...)
而不是附加循环解决其他性能问题。 - 很难理解为什么他们会向您发送零长度,但如果他们发送给您,除了浪费时间外,睡觉什么也做不了。删除那个。