28

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

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

3 回答 3

38

我怀疑你的光标正在移动到行的前面。你已经拥有的文本并没有消失,因为你没有用任何东西覆盖它。您可以输出空格以空白行,然后添加另一个 \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")

并获得“乐趣”。

于 2008-11-19T14:39:09.033 回答
7

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

于 2008-11-19T12:45:19.120 回答
3

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

System.out.println(mystuff);

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

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

于 2008-11-19T12:41:04.887 回答