如何在计时器上执行命令

时间:2013-03-25 15:35:01

标签: java timer

我编写了一个程序,通过用零填充来创建任何所需大小的文件。我试图通过每隔几秒钟冲洗它(让我们用5秒)而不是每个循环来优化它。当我尝试使用Timer时,代码output.flush();给出了一个错误。

public static void main(String[] args) throws IOException
{
    fileMaker fp = new fileMaker();

    Writer output = null;
    File f = new File(args[1]);
    output = new BufferedWriter(new FileWriter(f, true));
    output.write("0");

    long size = fp.getFileSize(args[1]);

    long mem = Long.parseLong(args[0]) * 1073741824; //1 Gigabyte = 1073741824 bytes


    while (size < mem)
    {
        output.write("");

        TimerTask fileProcessTask = new TimerTask()
        {
            @Override
            public void run()
            {
                output.flush();
                processFile();

            }
        };

        Timer tm = new Timer();
        tm.schedule(fileProcessTask, 5000L);


        size = fp.getFileSize(args[1]);

        double avg = (double) size / mem * 100;

        System.out.println(avg + "% complete");
    }
    output.close();
    System.out.println("Finished at " + size / 1073741824 + " Gigabyte(s)");

}

2 个答案:

答案 0 :(得分:0)

您提供的代码存在一些问题:

  • 您正在为while循环的每次迭代创建一个新的TimerTask和一个新的Timer。您只需要一个Timer来安排多个TimerTasks
  • 你也只需要一个TimerTask并使用Timer.schedule来重复执行任务(如timer.schedule(someTimerTask, 5000, 5000); [从5s开始,每5秒循环])
  • 当您在匿名内部类中访问时,您可能必须将output声明为final
  • 你为什么要写"0"""?您可能只想写零字节,而不是空字符(并且可能想直接使用FileOutputStream

答案 1 :(得分:0)

为什么你在output.flush收到错误的原因是因为你一旦取消while循环就永远不会取消任务。

while循环之后,您要做的第一件事就是输出close,所以下次计时器运行任务时它会关闭流,因此您会看到异常。