0

我编写了一个程序,通过用零填充它来创建任何所需大小的文件。我试图通过每隔几秒(让我们用 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)");

}
4

2 回答 2

0

出现错误的原因是因为一旦退出循环output.flush,您就永远不会取消任务。while

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

于 2013-03-25T15:56:05.220 回答
0

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

  • 您在 while 循环的每次迭代中都创建一个新的TimerTask和一个新的。Timer只需要一个 Timer 即可调度多个 TimerTask
  • 您也只需要一个TimerTask并使用Timer.schedule来重复执行任务(就像这样timer.schedule(someTimerTask, 5000, 5000);[start in 5s, loop every 5s])
  • 您可能必须在匿名内部类中访问它时output声明final
  • 你为什么要写"0"and ""?您可能只想写零字节,而不是空字符(并且可能想FileOutputStream直接使用 a)
于 2013-03-25T15:53:56.910 回答