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