Java 将InputStreamReader转换为字符串
是否有更好的方法从InputStreamReader读取字符串。 在分析器中,我得到了一个内存堆Java 将InputStreamReader转换为字符串,java,string,sockets,heap,inputstream,Java,String,Sockets,Heap,Inputstream,是否有更好的方法从InputStreamReader读取字符串。 在分析器中,我得到了一个内存堆 public String getClientMessage() throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(tempSocket.getInputStream())); char[] buffer = new char[200];
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();
}
我建议你们在图书馆里用一种更方便、更简单的方式做这些事情。
只需使用:
返回IOUtils.toString(tempSocket.getInputStream())代码>
但这只是一个代码风格的通知。我们不明白你所说的获取内存堆是什么意思。在任何情况下,如果内存不足,则必须为Java应用程序增加内存:
Java堆空间这表示无法分配对象
在堆里。问题可能只是配置问题。你可以
获取此错误,例如,如果
–Xmx命令行选项(或默认选择)不足以
应用程序。这也可能表明
无法对不再需要的应用程序进行垃圾收集,因为应用程序
无意中保留对它们的引用。帽子工具(参见
第7节)可用于查看所有可访问对象并理解
哪些引用使每个引用保持活动状态。另一个潜力
此错误的来源可能是服务器过度使用终结器
使调用终结器的线程无法保持
向队列中添加终结器的速率。jconsole
管理工具可用于监视正在运行的对象的数量
待最后定稿
您可以使用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();
}
你在“得到一堆内存”?这意味着什么?我在你的屏幕截图中看不到任何问题,除非你意外地执行了太多getClientMessage。我每隔一秒钟执行getClientMessage。亲爱的,我们不知道这些方法是如何相互交错的,这是一个非常有趣的问题:您从tempSocket
读取一些值,然后将其写回tempSocket
。某种类型的echo
服务,是吗?尝试了commons io,但我没有收到任何消息尝试调试或在方法sendServerMessage
中添加变量action
的打印输出。sendServerMessage实际上是有效的,因为我可以用char数组的方法给出字符串。。唯一的问题是,它效率不高。。无法打印任何内容。好吧,亲爱的,我们不知道这些方法在代码中是如何相互交错的,所以这可能是一个更深层的问题。@Ilendmlimuhammet此方法不打印任何内容。您希望打印什么内容?我怀疑问题在于,当消息停止时,您无法通过发送消息的方式知道。这意味着您必须一直阅读,直到您关闭了未进行的连接。如果您不想等到关闭,您需要添加一些知道消息何时完成的方法,例如换行符。此方法返回字符串,我将在其他地方打印它。问题是在读取读取器时(r.read(buffer))。。但我不知道如何解决这个问题。