将InputStreamReader转换为String

时间:2013-01-10 08:09:23

标签: java string sockets heap inputstream

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

提前致谢。

编辑: enter image description here

编辑: 消息与此一起发送:

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

2 个答案:

答案 0 :(得分:2)

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

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

但这只是代码式的通知。我们不明白术语获取内存堆是什么意思。在任何情况下,如果你没有足够的内存麻烦,你必须为你的Java应用程序增加内存:Memory Management in the Java HotSpot™ Virtual Machine

  

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

答案 1 :(得分: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();
}