3

我想提示用户开始输入字符,并且我希望他们能够输入任意长度的字符,直到他们按下 control+d 退出。

例如,他们可以键入一串数字,例如:1234567,一旦他们决定按 control+d,他们输入的行就会显示出来(因此不必按回车键)

我想我需要一个缓冲的阅读器或其他东西。有什么建议么?

4

6 回答 6

5

rlibby 说的很准确:CTL-D 将导致终端将缓冲的输入刷新到 JVM。但是,按键事件本身会被终端捕获并执行,而不是通过。

不过幸运的是,它很容易被发现。如果用户在其自己的一行上点击 CTL-D,则没有用于刷新的输入...对于 JVM,这与 EOF 无法区分。因此,System.in.read()-1根据 的合同返回InputStream。如果你System.in用 a包裹BufferedReaderreadLine()将返回null

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

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

String line;
while((line = systemIn.readLine()) != null) {
    // my program loop.
}

值得指出的一件事是,如果用户在输入字符后(但在返回之前)点击 CTL-D,您将获得这些字符。我不相信有一种方法可以在 CTL-D 不在自己的线路上时检测它。

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

于 2012-05-02T11:30:19.793 回答
3

http://download.oracle.com/javase/6/docs/api/java/io/BufferedInputStream.html#read%28%29

public class InputTest {
  public static void main(String[] args) throws IOException {
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    StringBuilder out = new StringBuilder();
    while (true) {
      try {
        int c = in.read();
        if (c != 4)  // ASCII 4 04 EOT (end of transmission) ctrl D, I may be wrong here
            out.append (c);
        else
            break;
      } catch (IOException e) {
        System.err.println ("Error reading input");
      }
    }
    System.out.println(out.toString());
  }
}
于 2011-04-29T22:18:54.740 回答
3

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

于 2011-04-29T22:23:17.797 回答
3

只需为像我这样在问题提出 9 年后出现的人添加另一个选项。如果您使用的是 java.util.Scanner,请使用 String input = in.next(); 使用 Ctrl+d 时将丢弃 NoSuchElementException。在这种情况下,您可以使用 try-catch 块来捕获该特定异常并结束程序的执行(通过中断或更改迭代值来停止循环)。

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;
  }
}
于 2020-08-25T05:00:21.313 回答
2

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

    // 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" );
于 2016-11-19T08:06:12.827 回答
0

在 GUI 中,您可以使用 KeyListener。

于 2011-04-29T22:04:43.567 回答