2013-03-25 31 views
0

我编写了一个程序,该程序通过填充零来创建任何所需大小的文件。我试图通过每隔几秒刷新一次(让5秒钟)而不是每个循环来优化它。当我尝试使用计时器时,代码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)"); 

} 
+0

什么类型的定时器?这是一个摇摆计时器吗? – 2013-03-25 15:38:14

+0

@Legend我将使用我试过的计时器代码编辑我的OP – user2007843 2013-03-25 15:39:50

+0

尝试在动作侦听器实现中使用一个swing计时器。 – 2013-03-25 15:41:55

回答

0

有一些问题与您提供的代码:

  • 您正在创建一个新的TimerTask和新Timer while循环的每次迭代。你只需要一个定时器来安排几个TimerTasks
  • 你也只需要一个单一的TimerTask和使用Timer.schedule重复执行任务(像这样timer.schedule(someTimerTask, 5000, 5000); [5秒内启动,循环每5秒])
  • 你可能得将output标为final,因为您在匿名内部类中访问它
  • 为什么你实际上在编写"0"""?你可能只想写零字节,而不是空字符(可能要直接FileOutputStream使用)
0

的原因,为什么你在output.flush得到一个错误,因为你永远不取消任务,一旦你掉出while循环。

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

相关问题