如何替换已经在 J​​ava 中打印在屏幕上的文本?

Posted

技术标签:

【中文标题】如何替换已经在 J​​ava 中打印在屏幕上的文本?【英文标题】:How can I replace text that's been printed out on screen already in Java? 【发布时间】:2012-07-31 10:38:47 【问题描述】:

我是 Java 新手,为了了解更多信息,我尝试制作一个时钟。它工作得很好,除了它每次一秒变化时都会在新行上打印。我该如何做才能用新时间替换已经打印出来的文本?

public class test 
    public static void main(String[] args) 
        test.clock();
    
    public static void clock() 
        int sec = 0;
        int min = 0;
        int h = 0;
        for(;;) 
            sec++;
            if(sec == 60) 
                min++;
                sec = 0;
             else if(min == 60) 
                h++;
                min = 0;
             else if(h == 24) 
                h = 0;
            
            try 
                Thread.sleep(1000);
             catch (InterruptedException e) 
                e.printStackTrace();
            
            if(h < 10) 
                System.out.print("0"+h+":");
             else 
                System.out.print(h+":");
            
            if(min < 10) 
                System.out.print("0"+min+":");
             else 
                System.out.print(min+":");
            
            if(sec < 10) 
                System.out.println("0"+sec);
             else 
                System.out.println(sec);
            
               
    

这是我的代码。这是我正在尝试做的一个例子: 我想转这个:00:00:00, 进入这个:00:00:01(代码会这样做,但它会打印在新行上并且不会删除旧时间)。 问题是我想摆脱第一个 (00:00:00) 并在同一行打印第二个 (00:00:01)。

这在 Java 中可行吗?

【问题讨论】:

相关:***.com/questions/606086/… 另见What's a good Java, curses-like, library for terminal applications? @McDowell - 哦,不错,谢谢。 【参考方案1】:

这实际上与java无关。相反,您希望您正在显示的 控制台 覆盖文本。

这可以通过发送回车符(Java 中的 \r)而不是换行符(Java 中的 \n)来完成(在任何语言中)。所以你从不使用 println(),只有在你想这样做的时候才使用 print()。如果你在第一次打印之前添加一个 print("\r") 它应该做你想要的。

顺便说一句,如果您将整个时间构建在一个字符串中,然后一次全部输出,那将会更加优雅和简单:)

【讨论】:

顺便说一句,eclipse可以那样做吗?当我测试它时它不起作用。 不,Eclipse 控制台不支持。如果您从命令行运行您的类(使用 java 命令),它应该可以按预期工作(Windows 控制台支持它,任何 Unix 控制台也应该支持)。 好的,谢谢!你知道是否有任何其他编译器可以支持它?如果我要在 cmd 中编译然后每次更改字母时都运行它,那么尝试的时间太长了。 不,我使用 Eclipse 已经很多年了,从那以后就没有尝试过其他任何一种(无论如何它们都提供或多或少相同)。 IDE 中的控制台用于调试目的,所以我认为如果它们支持回车,那将无济于事,因为它可能会掩盖输出。一个简单的解决方法是创建一个 .cmd 文件(在 Windows 上),其中包含 java 命令,然后是 pause 命令。然后,您可以在桌面上放置一个快捷方式,它会完成所有工作。不是最舒服,但比命令行好一点?【参考方案2】:

你可以做System.out.print("\u001B[A"); 使光标上一排。 以下是它的工作原理:

\u001B 是转义字符(27 ascii 码) [ 在转义字符之后 字母表示我们想用光标做什么

A:光标向上,B:光标向下,C:光标向右,D:光标向左,H:向左上角,M删除当前行,T:向上滚动,S:向下滚动, J: 删除所有向下到光标的行

警告这不适用于 cmd 或 powershell。

【讨论】:

以上是关于如何替换已经在 J​​ava 中打印在屏幕上的文本?的主要内容,如果未能解决你的问题,请参考以下文章

动画的Java多行文本删除[关闭]

获取“分段错误核心转储”

已经在 J​​ava 类中管理 ID 为 0 的 GoogleApiClient

Android如何在文本视图或任何东西中打印数组

如何在 iOS webview 中获取当前屏幕上的显示文本

sed工具