BufferedReader是否阻止标准控制台输入?

时间:2016-01-28 20:44:48

标签: java sockets bufferedreader

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

当您在终端中输入内容时,例如按" 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的影响。

1 个答案:

答案 0 :(得分:-1)

这在java中是不可能的。 至少不是与平台无关的方式。

您要做的是,逐个字符地阅读,而无需按Enter键。 但默认情况下,操作系统本身的控制台处于缓冲线模式。

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

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