我想提示用户开始输入字符,并且我希望他们能够输入任意长度的字符,直到他们按下 control+d 退出。
例如,他们可以键入一串数字,例如:1234567,一旦他们决定按 control+d,他们输入的行就会显示出来(因此不必按回车键)
我想我需要一个缓冲的阅读器或其他东西。有什么建议么?
我想提示用户开始输入字符,并且我希望他们能够输入任意长度的字符,直到他们按下 control+d 退出。
例如,他们可以键入一串数字,例如:1234567,一旦他们决定按 control+d,他们输入的行就会显示出来(因此不必按回车键)
我想我需要一个缓冲的阅读器或其他东西。有什么建议么?
rlibby 说的很准确:CTL-D 将导致终端将缓冲的输入刷新到 JVM。但是,按键事件本身会被终端捕获并执行,而不是通过。
不过幸运的是,它很容易被发现。如果用户在其自己的一行上点击 CTL-D,则没有用于刷新的输入...对于 JVM,这与 EOF 无法区分。因此,System.in.read()
将-1
根据 的合同返回InputStream
。如果你System.in
用 a包裹BufferedReader
,readLine()
将返回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。
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());
}
}
您混淆了 Java 程序和终端的角色。终端缓冲输入并偶尔将其提供给 Java 程序,尤其是在换行之后。Ctrl+D 还使终端使缓冲的输入可用,或者,如果没有缓冲,则终止输入。要求程序在 Ctrl+D 上做某事本质上是要求它在读取所有可用输入时做某事(以后可能会有更多可用输入)。在 Java 端缓冲输入将使事情变得更复杂,而不是更少。
只需为像我这样在问题提出 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;
}
}
试试这个代码。它实际上对我有用
// 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" );
在 GUI 中,您可以使用 KeyListener。