2013-03-25 29 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的輸出,所以下一次任務由定時器運行時它已經關閉了流,因此你會看到異常。

相關問題