3

我正在编写一个 Java 程序,需要在以下几个小时之间复制文件和文件夹:

Mon - 18:00 to 06:30
Tue - 18:00 to 06:30
Wed - 18:00 to 06:30
Thu - 18:00 to 06:30
Fri - 18:00 to 06:30
Sat - all day
Sun - all day

该程序将持续运行,直到完成所有文件和文件夹的复制。但是,在上述时间之外,程序应该只是休眠。

我正在使用属性文件来存储上述设置。

更新

我正在寻找最简单的实现,包括属性文件中属性的格式以及进行检查的代码。

4

5 回答 5

3

我会这样做

    final Map<Integer, String> schedule = new HashMap<>();
    // parse your settings and fill schedule
    schedule.put(Calendar.MONDAY, "18:00 to 06:30");
    // ...
    // create timer to fire e.g. every hour 
    new Timer().scheduleAtFixedRate(new TimerTask() {
        public void run() {
            Calendar c = Calendar.getInstance();
            String s = schedule.get(c.get(Calendar.DAY_OF_WEEK));
            if (withinTimeRange(c, s)) { // implement withinTimeRange func
                // copy files
            }
        }}, 0, 1000 * 3600); 
于 2013-05-07T12:06:51.323 回答
1

谢谢你的建议。

最后我想出了一个可行的解决方案,如果它得到足够的分数,我将标记为答案。我试图解决这个问题的方法是考虑非工作时间而不是工作时间。此代码仅用于说明

# Properties
Mon = 06:30-18:00
Tue = 06:30-18:00
Wed = 06:30-18:00
Thu = 06:30-18:00
Fri = 06:30-18:00

循环遍历属性以获取它们的值

String[] days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

Map<Integer, Integer[]> nonWorkingHours = new HashMap<Integer, Integer[]>();
for( int i = 0; i < days.length; i++ ) // for each property in file
{
    // excluded implementation of getConfig
    String prop = getConfig( days[ i ] ); // e.g. "06:00-19:00"

    // +1  to match CALENDAR.DAY_OF_WEEK
    nonWorkingHours.put( i + 1, getHours( prop ); 
}

我的解析属性的函数不包括错误处理

// e.g. if prop = "06:00-19:00" then { 6, 0, 19, 0 } is returned
public Integer[] getHours( String prop )
{
    String times = prop.split( "(:|-)" );
    Integer[] t = new Integer[4];

    for( int i = 0; i < times.length; i++ )
    {
        t[i] = Integer.parseInt( times[i] );
    }
    return t;
}

最后是实现停止的函数

private void sleepIfOutsideWorkingHours()
{
    Integer[] data = nonWorkingHours.get( currentDay );

    if( data != null )
    {
        Calendar c = Calendar.getInstance();
        Integer currentSeconds = ( Calendar.HOUR_OF_DAY * 3600 ) + ( Calendar.MINUTE * 60 );
        Integer stopFrom = ( data[ 0 ] * 3600 ) + ( data[ 1 ] * 60 );
        Integer stopTill = ( data[ 2 ] * 3600 ) + ( data[ 3 ] * 60 );

        if( currentSeconds > stopFrom && currentSeconds < stopTill )
        {
            Integer secondsDiff = stopTill - currentSeconds;

            if( secondsDiff > 0 )
            {
                try
                {
                    Thread.sleep( secondsDiff * 1000 ); // turn seconds to milliseconds
                }
                catch( InterruptedException e )
                {
                    // error handling
                }
            }
        }
    }   
}

最后,在复制每个文件之前调用下面的函数,如果它在工作时间之外运行,它将停止程序。

sleepIfOutsideWorkingHours();

我确信有一种更简单的方法可以做到这一点:-) 但它确实存在。

于 2013-05-08T10:18:48.177 回答
1

每当您的程序启动时,获取当前时间,并检查今天的日期。

检查它是否在允许的时间内,如果是,让它继续。如果不是,请查找“当天”上午 00:00 的时间。并在 xx:yyZZ(允许时间的开始)处找到时间。计算差值,然后让程序休眠这么长的时间。

于 2013-05-07T12:05:55.280 回答
1

由于您的程序将连续运行,因此最简单的解决方案是在复制文件之前检查日期和时间。如果时间是在下班时间,请继续复制下一个文件,否则Thread.sleep.

如果这是一个内部的一次性程序,我会继续硬编码营业时间,而不是读取属性文件。无需增加复杂性。

于 2013-05-07T12:00:12.640 回答
0

您应该尝试使用持续集成系统。例如,可以使用Jenkins CI轻松设置该场景。

我建议在这样的环境中这样做的原因是您可以更好地控制程序运行的历史记录。

于 2013-05-07T11:55:53.210 回答