Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将InputStreamReader转换为字符串_Java_String_Sockets_Heap_Inputstream - Fatal编程技术网

Java 将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];

是否有更好的方法从InputStreamReader读取字符串。 在分析器中,我得到了一个内存堆

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))。。但我不知道如何解决这个问题。