【问题标题】:Converting InputStreamReader into String将 InputStreamReader 转换为字符串
【发布时间】:2012-12-24 13:38:34
【问题描述】:

有没有更好的方法从 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();
}

【问题讨论】:

  • 您正在“获取内存堆”?这是什么意思?
  • 我在您的屏幕截图中看不到任何问题,除非您意外执行 getClientMessage 太多。
  • 我每隔一秒执行一次getClientMessage
  • 好吧,亲爱的,我们不知道这些方法是如何相互交错的,所以这可能是更深层次的问题。
  • 这很有趣:你从tempSocket 读取一些值并将其写回tempSocket。某种echo 服务,是吗?

标签: java string sockets heap-memory inputstream


【解决方案1】:

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

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

但这只是一个代码风格的通知。我们不明白您所说的获取内存堆是什么意思。无论如何,如果您有内存不足的烦恼,您必须为您的Java应用程序增加内存:Memory Management in the Java HotSpot™ Virtual Machine

Java堆空间这表示无法分配对象 在堆中。该问题可能只是配置问题。你可以 得到这个错误,例如,如果由指定的最大堆大小 -Xmx 命令行选项(或默认选中)不足 应用程序。这也可能表明对象是 不再需要的不能被垃圾收集,因为应用程序 无意中持有对它们的引用。 HAT 工具(参见 第 7 节)可用于查看所有可达对象并理解 哪些引用使每个引用都保持活力。另一种潜力 这个错误的来源可能是过度使用终结器 应用程序使得调用终结器的线程无法保留 随着终结器添加到队列中的速度。 jconsole 管理工具可用于监控对象的数量 待定。

【讨论】:

  • 尝试了 commons-io 但我没有收到任何消息
  • 尝试在方法sendServerMessage中调试或添加变量action的打印输出。
  • sendServerMessage 确实有效,因为我可以使用带有 char-Array 的方法提供字符串。唯一的问题是,它效率不高。
【解决方案2】:

您可以使用 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();
}

【讨论】:

  • 试过了,一样。。什么都不能打印出来。
  • 好吧,亲爱的,我们不知道这些方法在您的代码中是如何相互交错的,所以这可能是更深层次的问题。
  • @IlendemliMuhammet 此方法不打印任何内容。您希望在哪里打印?
  • 我怀疑问题是您无法从消息停止时发送消息的方式中知道。这意味着你必须阅读直到你关闭你没有做的连接。如果您不想等到关闭,则需要添加一些知道消息何时完成的方法,例如换行符。
  • 这个方法返回一个字符串,我在别的地方打印出来。问题是在阅读 Reader (r.read(buffer)).. 但我不知道如何解决这个问题。
猜你喜欢
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多