Java 读取输入直到控制+;D

Java 读取输入直到控制+;D,java,bufferedreader,Java,Bufferedreader,我想提示用户开始输入字符,我希望他们能够输入字符,只要他们想,直到他们点击control+d退出 例如,他们可以键入一组数字,如: 1234567 一旦他们决定点击control+d,他们输入的行就会显示出来(因此无需点击return) 我想我需要一个缓冲读取器之类的东西。有什么建议吗?在GUI中,您可以使用KeyListener 您混淆了Java程序和终端的角色。终端缓冲输入并偶尔将其提供给Java程序,尤其是在换行之后。Ctrl+D还会使终端使缓冲输入可用,或者,如果没有缓冲,则终止输入。

我想提示用户开始输入字符,我希望他们能够输入字符,只要他们想,直到他们点击control+d退出

例如,他们可以键入一组数字,如: 1234567 一旦他们决定点击control+d,他们输入的行就会显示出来(因此无需点击return)


我想我需要一个缓冲读取器之类的东西。有什么建议吗?

在GUI中,您可以使用KeyListener


您混淆了Java程序和终端的角色。终端缓冲输入并偶尔将其提供给Java程序,尤其是在换行之后。Ctrl+D还会使终端使缓冲输入可用,或者,如果没有缓冲,则终止输入。要求程序在Ctrl+D上执行某些操作本质上就是要求程序在读取所有可用输入时执行某些操作(以后可能会有更多可用输入)。Java端的缓冲输入将使事情变得更复杂,而不是更少。

rlibby所说的恰到好处:CTL-D将导致终端将缓冲输入刷新到JVM。但是,按键事件本身由终端捕获和执行,而不是传递

不过幸运的是,它很容易被发现。如果用户在自己的一行中点击CTL-D,则没有要刷新的输入……这对于JVM来说与EOF是无法区分的。因此,
System.in.read()。如果使用
BufferedReader
包装
System.in
readLine()
将返回
null

这是我刚刚编写的交互式命令行工具的主循环:

BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));

String line;
while((line = systemIn.readLine()) != null) {
    // my program loop.
}
值得指出的一点是,如果用户在输入字符后(但在输入return之前)点击CTL-D,您将得到这些字符。我认为当CTL-D不在自己的线路上时,没有办法检测到它


免责声明:我不知道这如何适用于Windows。

试试这段代码。它实际上对我有用

    // press ctrl+Z(windows) and ctrl+D(mac, linux) for input termination
    StringBuilder out = new StringBuilder();
    String text = null;
    Scanner scanner = new Scanner( System.in );
    while( scanner.hasNextLine() )
    {
        text = new String( scanner.nextLine() );
        out.append( text );
    }
    scanner.close();
    System.out.println( out );
    System.out.println( "program terminated" );

只是为像我这样的人增加了另一个选择,他们在被问到这个问题9年后才出现。如果您使用的是java.util.Scanner,请使用字符串input=in.next();当使用Ctrl+d时,将删除NoTouchElementException。在这种情况下,您可以使用try-catch块捕获特定的异常并结束程序的执行(通过中断或更改迭代值来停止循环)


我在java方面没有太多经验,但是,在C风格中,我会使用一个char read函数在一段时间(key!=ctrl+d)循环中完成这项工作,然后他们寻找组合键使其停止(不知道它在java中实际是如何读取的)EDIT:Nvm,看起来java有很好的方法来完成这项工作04似乎是正确的,但它不起作用,因为System.in是缓冲的。我不确定是否可以阻止缓冲,或者将buffersize设置为1。@用户我不认为这是因为缓冲了(尽管我可能错了)。我更倾向于一种解释,比如rlibby发布的解释。也许终端甚至不发送那个字符?如果(c!=4 | | c!=-1)
,也许代码应该更改为
?也许我错了,但从“不按回车键”开始,我希望他想不受缓冲地阅读所有内容。我不认为按Ctrl-D键而不是按Enter键有什么好处。正常的“读线”在^D之前接受当前缓冲区,不是吗?@user是的,毕竟是“传输结束”。无论如何,OP对于如何使用这段代码是相当神秘的。即使OP使用的是标准终端,我们也不知道:/
    // press ctrl+Z(windows) and ctrl+D(mac, linux) for input termination
    StringBuilder out = new StringBuilder();
    String text = null;
    Scanner scanner = new Scanner( System.in );
    while( scanner.hasNextLine() )
    {
        text = new String( scanner.nextLine() );
        out.append( text );
    }
    scanner.close();
    System.out.println( out );
    System.out.println( "program terminated" );
import java.util.Scanner;

while (some condition) {
  try {
    (take your input using the in.next() function here)
    ...
  } catch (java.util.NoSuchElementException e) {
    (some condition) = false;
    //OR break;
  }
}