针对更大的字符串优化 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,因为这会读取网络字节顺序。
  • BufferedInputStreamSystem.in 之间添加一个 BufferedInputStream:这将解决主要的性能问题。
  • 通过new String(data,...)而不是附加循环解决其他性能问题。
  • 很难理解为什么他们会向您发送零长度,但如果他们发送给您,除了浪费时间外,睡觉什么也做不了。删除那个。