【问题标题】:Is BufferedReader blocking the standard console input?BufferedReader 是否阻塞了标准控制台输入?
【发布时间】:2016-01-28 20:44:47
【问题描述】:

我正在用 Java 编写一个简单的聊天应用程序,一切正常,除了以下奇怪的错误:

当你在终端输入一些东西时,例如你按“a”,控制台写“a”,然后你按“i”,它写“i”,“r”->“r”...并且您会在控制台中看到单词(例如“air”)。

在我的情况下,我按“e”,控制台写“(无)”,“i”->“(注意)”,“r”->(无),只有在我突然按“输入”控制台后显示整个单词“air”,以相同的方式与多个单词一起使用。实际上,用户可以写任何他/她想要的内容,但是只有在按下 Enter 后才会出现键入的文本。

在我的程序中,我使用BufferedReader 对象从套接字读取:

try( ....some socket stuff....
      PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),true);//out is the socket output
      BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); //in is the socket input

BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); //that's the standard input, the one from keyboard
 while(true){
          if (stdIn.ready()){
            userInput=stdIn.readLine();
            out.println(userInput);
            if(userInput.equals("Bye.")) break;
            System.out.println("Me: "+userInput);
          }

          if(in.ready()){
          if((serverInput= in.readLine())!=null){
              System.out.println("Stranger: "+serverInput);
            }

          }

在我看来,这些方法 - readyreadline() - 可能会导致控制台出错。对我来说这似乎有点奇怪,但它是 Java,我不是很熟练。

除此之外,聊天就像魅力一样 - 它可以正确发送和接收。 read-receive-input 脚本与客户端完全相同。当您输入一条消息时,控制台中不会显示任何内容,但它确实存在并且在 Enter 时它会显示,这不是延迟,而是受 Enter 的影响。

【问题讨论】:

  • 您如何调用应用程序?我尝试了一段类似的代码,它对我有用,我猜你的环境正在抑制来自终端的输入,它在 enter 上打印的原因是因为 out.println(userInput);
  • #ecarlos 我用 java ServerSide 和 java ClientSide 初始化程序然后它就可以工作了......服务器有它的 Serversocket 和一个普通的 socket 使用 .accept( ) 方法。没什么特别的,你只是在输入的时候看不到你在输入什么,这是令人讨厌的部分。你能建议什么可能“抑制”来自终端的输入吗?
  • 你不知何故让控制台进入无回显模式。和BufferedReader没有任何关系。

标签: java sockets bufferedreader


【解决方案1】:

这在 java 中是不可能的。 至少不是独立于平台的方式。

您要做的是逐个字符地读取,而不按回车键。 但是 os 本身的控制台默认是缓冲行模式。

因此,唯一的解决方案是将您的控制台置于原始模式(绕过行编辑并且不需要输入键),使其依赖于平台。

编辑:您的描述说字符阅读,顺便说一下,您的代码正在做其他事情。

【讨论】:

  • 是的,控制台不显示用户正在输入的内容不是我的意愿,它会自行发生,我无法找出我的代码导致它的原因。你能给我推荐一种方法或阅读的东西吗?无论我在控制台、命令、其他文本中写什么,这个问题都不会出现,只是在这种特殊情况下。可能我理解的不是很清楚,如果是这样的话,抱歉。
猜你喜欢
  • 1970-01-01
  • 2011-01-25
  • 2011-12-27
相关资源
最近更新 更多