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)");

}
4

2 に答える 2

0

提供したコードにはいくつかの問題があります。

  • whileループのすべての反復でTimerTask新しいものを作成しています。Timer複数のTimerTasksをスケジュールするために必要なタイマーは1つだけです
  • また、必要なのは1つだけで、タスクを繰り返し実行するためにTimerTask使用します(たとえば、[5秒で開始、5秒ごとにループ])Timer.scheduletimer.schedule(someTimerTask, 5000, 5000);
  • 匿名の内部クラスでアクセスしているので、outputおそらく宣言する必要がありますfinal
  • なぜあなたは実際に書い"0"ているの""ですか?空の文字ではなく、おそらくゼロバイトだけを書きたいと思うでしょう(そしておそらくFileOutputStream直接使用したいと思うでしょう)
于 2013-03-25T15:53:56.910 に答える
0

エラーが発生する理由は、ループから抜けるoutput.flushとタスクをキャンセルしないためです。while

whileループの後で最初に行うことcloseは出力に対してです。そのため、次にタスクがタイマーによって実行されると、ストリームが閉じられます。したがって、例外が表示されます。

于 2013-03-25T15:56:05.220 に答える