1

我正在编写一些代码来每分钟创建和运行 18000 个测试,持续 24 小时,并将结果存储在.dat我可以执行的文件中。

我的下一个任务是在每小时开始时获取时间戳、设备 ID 和随机测试 ID 并将其存储在一个.idx文件中,因此它只有 24 行数据。

我遇到了麻烦。我可以让它在每小时开始时打印结果,但它也会打印每次测试的结果,而我只希望它在每小时开始时进行随机测试。

这是我到目前为止所做的;

public static void main (String [] args) throws FileNotFoundException
{ 
    DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
    Date date = new Date();

    File fileNameDat = new File(df.format(date) + ".dat");
    File fileNameIdx = new File(df.format(date) + ".idx");

    RandomAccessFile rafDat = new RandomAccessFile(fileNameDat, "rw");
    RandomAccessFile rafIdx = new RandomAccessFile(fileNameIdx, "rw");
    Random rand = new Random();

    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    cal.add(Calendar.MILLISECOND, -cal.get(Calendar.MILLISECOND));
    cal.add(Calendar.SECOND, -cal.get(Calendar.SECOND));
    cal.add(Calendar.MINUTE, -cal.get(Calendar.MINUTE));
    cal.add(Calendar.HOUR_OF_DAY, -cal.get(Calendar.HOUR_OF_DAY));

    try
    {
        for(int hours = 0; hours < 24; hours++)
        {   
            for(int tests = 1; tests <= 10; tests++)        //18000 tests in total
            {   
                for(int mins = 0; mins < 60; mins++)
                {   
                    rafDat.writeLong(cal.getTimeInMillis() + mins * 60000);     //Timestamp 
                    rafDat.writeInt(283);                                       //Device ID
                    rafDat.writeInt(tests);                                     //Test ID
                    rafDat.write((byte)1);                                      //Availability
                    rafDat.writeInt(rand.nextInt(500));                         //Latency           
                }

                if(cal.get(Calendar.MILLISECOND) == 0 && cal.get(Calendar.SECOND) == 0 && cal.get(Calendar.MINUTE) == 0 && tests <= 2)
                {
                    rafIdx.writeLong(cal.getTimeInMillis());
                    rafIdx.writeInt(0);
                    rafIdx.writeInt(rand.nextInt(tests));
                }
            }
            cal.add(Calendar.HOUR_OF_DAY, 1);
        }
        rafDat.close();
        rafIdx.close();
    } 
    catch(IOException iOE) 
    {
        System.err.println(iOE);
    }
}
4

1 回答 1

0

在您的代码中

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
cal.add(Calendar.MILLISECOND, -cal.get(Calendar.MILLISECOND));
cal.add(Calendar.SECOND, -cal.get(Calendar.SECOND));
cal.add(Calendar.MINUTE, -cal.get(Calendar.MINUTE));
cal.add(Calendar.HOUR_OF_DAY, -cal.get(Calendar.HOUR_OF_DAY));

你确保 cal 没有毫秒,没有秒,没有分钟,所以

cal.get(Calendar.MILLISECOND) == 0 && cal.get(Calendar.SECOND) == 0 && cal.get(Calendar.MINUTE) == 0

总是正确的。这具有对于测试 1 和 2 的效果,向 rafIdx 写入了一些内容:

if(cal.get(Calendar.MILLISECOND) == 0 && cal.get(Calendar.SECOND) == 0 && cal.get(Calendar.MINUTE) == 0 && tests <= 2)
{
    rafIdx.writeLong(cal.getTimeInMillis());
    rafIdx.writeInt(0);
    rafIdx.writeInt(rand.nextInt(tests));
}

您的cal对象仅在hours loop的每次迭代中更新,然后仅更新小时,保持条件有效并解释您的结果。

我不太清楚从哪里开始重写代码以实现您想要的,但也许最简单的选择是在seconds loopcal的每次迭代中为您的对象添加一秒。为了使此方法与您的描述相匹配,您还应该构建一种机制,以确保在seconds 循环的每次迭代中恰好经过一秒。

于 2013-11-08T11:32:01.630 回答