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