从socket和inputStream慢读

时间:2015-03-19 18:44:56

标签: java performance sockets stream inputstream

我使用java.net.Socket在我的应用程序中接收消息。接收非常缓慢。接收250 kB持续7秒。我该怎么做才能加速这一点。 7秒太多了......

        InputStream is = null;
        byte[] arr = new byte[8192];
        try {
             is = client.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }

        int bytesNumber;
        StringBuffer sb = new StringBuffer();


        try {
            while((bytesNumber = is.read(arr)) >= 0) {
                if(bytesNumber == 8192) {
                    sb.append(arr);
                    continue;
                } else {
                    for (int i = 0; i < bytesNumber; i++) {
                        sb.append(arr[i]);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

3 个答案:

答案 0 :(得分:0)

这是因为如果读取的缓冲区(arr)长度小于一个,则将一个字符附加一个。添加整个缓冲区内容,不需要if:

sb.append(arr,0,butesNumber);

答案 1 :(得分:0)

正如修补匠所提到的,通常最大的限制是客户端和服务器网络。但是你可以大大简化你拥有的东西。另外,在我看来,你的缓冲区大小太小了8K。除非您有严重的内存限制,否则请使用1M或更大版本。

public String readClient(Client client) throws IOException{
    final int bufferSize = 1024 << 9;

    BufferedInputStream in = new BufferedInputStream(client.getInputStream(),bufferSize);
    byte[] bytes = new byte[bufferSize];
    int bytesRead;
    StringBuilder sb = new StringBuilder(bufferSize);
    try {
        while ((bytesRead = in.read(bytes)) != -1) {
            sb.append(new String(bytes, 0, bytesRead));
        }
    }finally {
        in.close();
    }
    return sb.toString();
}

答案 2 :(得分:0)

这种糟糕的表现不太可能是由于您的代码造成的。在同一系统之间使用curl或类似的东西可以获得什么样的性能?

更大的问题是你的代码不太可能做你想要的。当前,您将字节数组的表示附加到字符串,或将字节的十进制表示附加到该字符串。如果服务器发送“Hello,World!”,您最终会得到一个字符串“7210110810811144328711111410810033”。对于较长的文件,您会看到类似“[B @ 76c5a2f7”弹出的内容,这是字节数组的打印方式。

我会写这样的东西,假设你收到用UTF-8编码的文本:

CharArrayWriter str = new CharArrayWriter();
try (InputStream is = client.getInputStream()) {
  Reader r = new InputStreamReader(is, StandardCharsets.UTF_8);
  char[] buffer = new char[8192];
  while (true) {
    int n = r.read(buffer);
    if (n < 0)
      break;
    str.write(buffer, 0, n);
  }
}
System.out.println(str);