用于使时间出现在同一位置的控制台程序

时间:2014-06-30 10:21:42

标签: java multithreading datetime

我正在尝试编写一个控制台程序,以递归方式在同一行和位置显示当前时间。

我尝试了很多但是使用普通System.out.println打印多行, 所以我使用了printstream obj。现在的问题是,它出现在相同的位置,但没有得到更新。

我无法确定线程或打印流是否存在问题。请帮助我解决这个问题,还是有其他任何方法可以在控制台操作中以相同的位置递归显示事物?

import java.util.Date;
import java.io.IOException;
import java.io.*;
public class DateDemo {
  // boolean flag=true;
  public static void main(String args[]) {
    DisplayTime dt=new DisplayTime();
    Thread thread1=new Thread(dt,"MyThread");
    //thread1.start();
    thread1.run();
  }
}


class DisplayTime extends Thread{
  public void run(){  
    try{
      while(true){
        showTime();
        Thread.sleep(1000);

      }
    }catch(InterruptedException e){
      System.err.println(e);
    }
  }

  public void showTime(){
    try{


      PrintStream original = new PrintStream(System.out);
      //replace the System.out, here I redirect to 
      System.setOut(new PrintStream(new FileOutputStream("stdout.log")));
      //System.out.println("bar");  // no output
      Date date =new Date();
      original.print(date.toString());
      //System.out.println(date.toString());

      System.out.flush();
      // output to stdout
      //original.close();
    }
    catch(Exception e){
      System.err.println(e);

    }
  }``
}

4 个答案:

答案 0 :(得分:5)

首先,您的标题具有误导性,请阅读Recursion的含义。

您需要做的是用新时间覆盖当前行。这是在控制台程序中通过使用回车字符\r完成的(返回一个字符,您可以使用退格字符\b

您可以尝试这样的事情(请注意,为此,您必须不要在行尾添加新的行字符\n):

import java.text.SimpleDateFormat;
import java.util.Date;

public class Time {

    public static void main(String... args) throws InterruptedException {
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        while(true) {
            System.out.printf("\r%s", sdf.format(new Date()));
            Thread.sleep(1000);
        }
    }
}

答案 1 :(得分:1)

另一种方法是从当前行((char)8)中删除多个字符:

public class Time {

    public static void main(String... args) throws InterruptedException {
        while (true) {
            Date now = new Date();
            System.out.print(now.toString());
            Thread.sleep(1000);
            for (int i = 0; i < now.toString().length(); i++) {
                System.out.print((char) 8);
            }
        }
    }
}

但是像A4L的回答一样,这不会在每个控制台上工作,即Eclipse。

答案 2 :(得分:0)

如果你对system.out.println()的问题是它总是打印另一行,那么只需尝试使用system.out.print()并在打印后给它一个system.out.print(\ n)或系统.print.out.println()

答案 3 :(得分:0)

我之前从未使用过这个库,但我认为给你你想要的东西。基本上java相当于旧skool curses库的终端应用程序。

http://sourceforge.net/projects/javacurses/

stackoverflow上的另一个人提到了lanterna - &gt; https://stackoverflow.com/a/12896503/3465651