【问题标题】:How can I return to the start of a line in a console?如何在控制台中返回到行首?
【发布时间】:2010-09-23 00:56:19
【问题描述】:

如何返回到行首并覆盖控制台上已经输出的内容?以下似乎不起作用:

System.out.print(mystuff+'\r');

【问题讨论】:

    标签: java console


    【解决方案1】:

    如果你只是想在控制台写一个新行,你应该使用 println() 方法:

    System.out.println(mystuff);
    

    但是,这不会删除已经在线的内容。实际上,由于 System.out 是一个 PrintStream,它是 OutputStream 的一种类型,这基本上很难做到,尽管您可能会找到特定于终端的方法来做到这一点。

    使用 curses 库的 Java 实现可能会更好,例如 JavaCurses

    【讨论】:

      【解决方案2】:

      我的猜测(这是一个猜测)是 '\r' 确实有效,但您使用的控制台并没有按照您的预期处理它。您使用的是哪个控制台?如果它类似于 IDE 中的控制台输出,您是否在真正的命令行上尝试过?

      【讨论】:

      【解决方案3】:

      我怀疑您的光标正在移动到行首。你已经拥有的文本并没有消失,因为你没有用任何东西覆盖它。您可以输出空格以空白行,然后添加另一个 \r。

      我刚刚在 Windows XP 和 AIX 上测试了以下内容,它按预期工作:

      public class Foo {
        public static void main(String[] args) throws Exception {
         System.out.print("old line");
         Thread.sleep(3000);
         System.out.print("\rnew");
        }
      }
      

      我打印出“旧行”,延迟 3 秒,然后“旧行”变为“新行”

      我故意让第一行比第二行长,以证明如果你想删除整行,你必须用空格覆盖结尾。

      还请注意,“\b”转义序列将备份 1 个空格,而不是到行首。所以如果你只想擦除最后 2 个字符,你可以写:

      System.out.println("foo\b\bun")
      

      并获得“乐趣”。

      【讨论】:

      • main() 应该捕获异常! :D
      • 在实际代码中,是的。在 3 行测试行为,不值得我花时间。 :)
      • 但是在实际应用中,如果 3 秒的延迟太长了怎么办,那么最短但合适的时间应该是多少?
      • @frewper 在一个真正的应用程序中你根本不需要延迟它:)
      猜你喜欢
      • 2013-07-31
      • 1970-01-01
      • 2015-01-16
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 2018-04-18
      相关资源
      最近更新 更多