Java中为何System.out.print()需等待输入后才输出?
解决System.out.print()延迟输出的问题
嘿,我明白你遇到的这个小麻烦了——明明写了System.out.print()想让提示语先显示出来,结果非要等输入完年龄才一起冒出来,对吧?
这其实是Java控制台输出的缓冲机制在搞鬼:System.out默认是「行缓冲」模式,意思是它会把输出内容先存在缓冲区里,只有当遇到换行符(比如println()里的\n)、缓冲区被填满,或者程序主动触发刷新操作时,才会把缓冲区里的内容真正打印到控制台。而你用print()的时候没有加换行,所以那句"How old are you? "一直待在缓冲区里,直到你输入完回车,缓冲区才被触发刷新,这句话才跟着显示出来。
给你几个实用的解决办法:
方法一:手动刷新缓冲区(最推荐)
在System.out.print()之后调用flush()方法,强制把缓冲区里的内容立刻输出到控制台,这样提示语就会先显示出来,等你输入年龄:Scanner scan = new Scanner(System.in); System.out.print("How old are you? "); System.out.flush(); // 关键:手动刷新输出缓冲区 int age = Integer.valueOf(scan.nextLine()); if (age >= 0 && age <= 120) { System.out.println("OK"); } else { System.out.println("Impossible!"); }方法二:用无缓冲的错误输出流(不推荐常规场景)
System.err是Java的错误输出流,它默认是无缓冲的,内容会直接输出到控制台。不过这个流本来是用来打印错误信息的,用它输出正常提示语有点“不务正业”,应急可以用,但不建议作为常规写法:Scanner scan = new Scanner(System.in); System.err.print("How old are you? "); // 用err流输出,无缓冲 int age = Integer.valueOf(scan.nextLine()); if (age >= 0 && age <= 120) { System.out.println("OK"); } else { System.out.println("Impossible!"); }方法三:加换行符(不符合你的需求,仅作补充)
如果把print()改成println(),提示语末尾会加换行符,缓冲区会立刻刷新,但这样输入就会跑到下一行,不符合你想要“输入和提示在同一行”的要求,所以这个方法对你来说不适用。
内容的提问来源于stack exchange,提问作者helpme
相关产品推荐
相关产品推荐

