Java - 从.dat文件中获取某些信息并将其放入.idx文件中

时间:2013-11-08 11:13:49

标签: java

我正在编写一些代码,每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);
    }
}

1 个答案:

答案 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对象添加一秒。要使此方法与您的描述相匹配,您还应该构建一种机制,以确保秒循环的每次迭代都经过一秒钟。