我正在编写一些代码,每24分钟创建并运行18000次测试,并将结果存储在.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);
}
}
答案 0 :(得分: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
对象仅在小时循环的每次迭代时更新,然后只更新小时,保持条件有效并解释结果。
我不清楚从哪里开始重写你的代码以实现你想要的东西,但也许最简单的选择是在秒循环的每次迭代中为你的cal
对象添加一秒。要使此方法与您的描述相匹配,您还应该构建一种机制,以确保秒循环的每次迭代都经过一秒钟。