0

有没有更好的方法从 InputStreamReader 读取字符串。在 Profiler 中,我在那里得到了一个内存堆。

public String getClientMessage() throws IOException {
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(tempSocket.getInputStream()));     
    char[] buffer = new char[200];
    return new String(buffer, 0, bufferedReader.read(buffer));
}

提前致谢。

编辑: 在此处输入图像描述

编辑:消息是这样发送的:

public void sendServerMessage(String action) throws IOException{
    PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(tempSocket.getOutputStream()));
    printWriter.print(action);
    printWriter.flush();
}
4

2 回答 2

2

我建议你commons-io 图书馆以更方便和简单的方式做这些事情。只需使用:

return IOUtils.toString(tempSocket.getInputStream());

但这只是代码风格的通知。我们不明白你所说的获取内存堆是什么意思。无论如何,如果您有内存不足的烦恼,您必须为您的 Java 应用程序增加内存:Java HotSpot™ 虚拟机中的内存管理

Java 堆空间这表明无法在堆中分配对象。该问题可能只是配置问题。例如,如果 –Xmx 命令行选项(或默认选择)指定的最大堆大小对于应用程序来说不足,您可能会收到此错误。这也可能表明不再需要的对象不能被垃圾回收,因为应用程序无意中持有对它们的引用。HAT 工具(参见第 7 节)可用于查看所有可达对象并了解哪些引用使每个对象保持活动状态。此错误的另一个潜在来源可能是应用程序过度使用终结器,使得调用终结器的线程无法跟上将终结器添加到队列的速度。

于 2013-01-10T08:21:08.410 回答
0

您可以使用 IOUtils,但如果您不能使用该库,则很容易编写。

public String getClientMessage() throws IOException {
    Reader r = new InputStreamReader(tempSocket.getInputStream());
    char[] buffer = new char[4096];
    StringBuilder sb = new StringBuilder();
    for(int len; (len = r.read(buffer)) > 0;)
         sb.append(buffer, 0, len);
    return sb.toString();
}

我怀疑问题是您无法从消息停止时发送消息的方式中知道。这意味着您必须阅读,直到您关闭您不做的连接。如果您不想等到关闭,您需要添加一些知道消息何时完成的方法,例如换行符。

// create this once per socket.
final PrintWriter out = new PrintWriter(
      new OutputStreamWriter(tempSocket.getOutputStream(), "UTF-8"), true);

public void sendServerMessage(String action) {
    // assuming there is no newlines in the message
    printWriter.println(action);  // auto flushed.
}

// create this once per socket
BufferedReader in = new BufferedReader(
    new InputStreamReader(tempSocket.getInputStream(), "UTF-8"));     

public String getClientMessage() throws IOException {
     // read until the end of a line, which is the end of a message.
      return in.readLine();
}
于 2013-01-10T08:24:29.690 回答