2013-03-25 3 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

+0

Попробуйте использовать таймер качания с реализацией функции прослушивания. – 2013-03-25 15:41:55

ответ

0

Есть некоторые проблемы с кодом вы предоставили:

  • Вы создаете новый TimerTask и новый Timer каждую итерацию цикла. Вам нужно только один таймер запланировать несколько TimerTasks
  • Вы также только нужно одна TimerTask и использовать Timer.schedule для повторного выполнения задачи (например, так timer.schedule(someTimerTask, 5000, 5000); [начать в 5с, цикл каждые 5с])
  • Вы, вероятно, придется объявить output как final как вы обращаетесь к нему в анонимном внутреннем классе
  • Почему вы на самом деле пишете "0" и ""? Вы, вероятно, только хотите писать нулевые байты, а не пустые символы (и, вероятно, хотят использовать FileOutputStream непосредственно)
0

Причины, почему вы получаете ошибку в output.flush, потому что вы никогда не отменить задание, как только вы выпадете петлю while.

Первое, что вы делаете после цикла while, - это результат вывода close, поэтому в следующий раз, когда задача запускается таймером, он закрыл поток, поэтому исключение вы видите.

Смежные вопросы