Java 为什么可以';我们不能从System.in中一次读取一个字符吗?
下面的程序打印在标准中写入的每个字符,但仅在写入新行之后(至少在我的系统上!) 这可以防止人们编写诸如“按任意键继续”之类的内容,并强制执行诸如“按enter键继续”之类的内容Java 为什么可以';我们不能从System.in中一次读取一个字符吗?,java,stdin,Java,Stdin,下面的程序打印在标准中写入的每个字符,但仅在写入新行之后(至少在我的系统上!) 这可以防止人们编写诸如“按任意键继续”之类的内容,并强制执行诸如“按enter键继续”之类的内容 这背后的原因是什么 这是Java的局限性吗 这种行为依赖于系统吗(我在Ubuntu上)?它在Mac上是如何工作的?窗户 它是否取决于我运行应用程序的特定终端?(对我来说,它在Eclipse和gnome终端中的行为与此类似) 有解决办法吗 这背后的原因是什么 默认情况下,大多数终端都是行缓冲的,Java在换行之前不会接
- 这背后的原因是什么
- 这是Java的局限性吗
- 这种行为依赖于系统吗(我在Ubuntu上)?它在Mac上是如何工作的?窗户
- 它是否取决于我运行应用程序的特定终端?(对我来说,它在Eclipse和gnome终端中的行为与此类似)
- 有解决办法吗
公共静态void getCh(){
最终JFrame=新JFrame();
同步(帧){
框架。设置未装饰(真实);
frame.getRootPane().setWindowDecorationStyle(JRootPane.frame);
frame.addKeyListener(新的KeyListener(){
按下公共无效键(按键事件e){
同步(帧){
frame.setVisible(假);
frame.dispose();
frame.notify();
}
}
公开无效密钥已释放(密钥事件e){
}
public void keyTyped(KeyEvent e){
}
});
frame.setVisible(true);
试试{
frame.wait();
}捕获(中断异常e1){
}
}
}
我在Ubuntu上
有解决办法吗
在此之后,在同一进程中对System.in的所有读取都将读取1个字符,而不是等待下线。请参阅我的答案,除非您使用以下命令:
exec(新字符串[]{”/bin/sh“,“-c”,“stty-icanon min 1
public class Test {
public static void main(String[] args) throws java.io.IOException {
int c;
while ((c = System.in.read()) != -1)
System.out.print((char) c);
}
}
public static void getCh() {
final JFrame frame = new JFrame();
synchronized (frame) {
frame.setUndecorated(true);
frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
frame.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
synchronized (frame) {
frame.setVisible(false);
frame.dispose();
frame.notify();
}
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
});
frame.setVisible(true);
try {
frame.wait();
} catch (InterruptedException e1) {
}
}
Runtime.getRuntime().exec("stty -icanon min 1").waitFor();