java实现电脑定时关机的方法
本文实例讲述了java如何注册成windows服务程序及一个简单的java定时关机程序代码,分享给大家供大家参考。具体方法如下:
一、问题:
最近想找个软件来控制电脑的关机时间,在网上找了几个,都是可视化界面的可以设置具体的关机时间的软件。由于我想编写的关机程序是运行在别人机器上,只能让该机器在晚上17点到23点25分才上网,到了23点25分就可以自动关机。为了让别人感觉不到这个软件的“存在”(免得使用者自己关闭定时关机软件),所以我想把关机软件注册为服务的方式,运行在后台。这里介绍下如何利用javaService软件把java程序注册为windows服务。
二、实现方法:
1.利用javaService注册java程序为windows服务
①下载javaService
访问网址http://javaservice.objectweb.org/下载windows版本的javaService文件,我下载的是JavaService-2.0.10.rar,目前最新的版本就是“2.0.10”。
②安装javaService
解压我们下载下来的javaServices到一个目录,我是解压到目录“D:/software/JavaService-2.0.10”下(解压到任何目录都可以,最好别解压到中文目录,省的出现问题)
③编写定时关机代码
1) 类的名字为:
com.test.timer.TimerShutDownWindows
2) 把编写后的java文件导出为class的形式,把导出的类放到目录“D:/software/JavaService-2.0.10/classes/com/test/timer”下。也就是把导出的com包放到
“D:/software/JavaService-2.0.10/classes”目录下。
④注册java程序为windows服务
进入“D:/software/JavaService-2.0.10“目录,执行如下命令:
JavaService.exe-installMyShutDownService"%JAVA_HOME%"/jre/bin/server/jvm.dll-Djava.class.path="%JAVA_HOME%"/lib/tools.jar;D:/software/JavaService-2.0.10/classes-startcom.test.timer.TimerShutDownWindows
其中“-install“后面的参数为服务的名称,“-start”参数后边是要启动的类名,“Djava.class.path”后面参数中的
“D:/software/JavaService-2.0.10/classe”地址是我的“TimerShutDownWindows”类存放的路径,实际应用中修改为自己的classPath即可。
这里需要注意几点:
1) “%JAVA_HOME%”jdk目录,如果没有配置jdk目录,则替换为jdk的实际绝对地址。
2) -Djava.class.path是必须的,因为服务启动的时候无法访问系统的CLASSPATH变量,所以必须在这里声明;如果jar比较多,为避免写的命令过长,我们可以使用“-Djava.ext.dirs=jars所在目录”参数。
3) 服务添加之后,可以在命令行中敲入“services.msc”命令来查看所有服务,并可以对服务的启动类型(自动启动还是手动启动等)进行修改。
⑤测试
1) 启动服务
当我们注册完服务后,我们可以通过命令“netstartMyShutDownService”来启动该服务,服务启动后会在D盘根目录生成my_shutdown.log日志文件。
2) 关闭服务
如果我们要关闭服务,可以通过命令“netstopMyShutDownService”来关闭该服务。
3) 删除服务
当我们想删除该服务时,可以使用命令“scdeleteMyShutDownService”来删除该服务。
2.定时关机代码
packagecom.test.timer; importjava.io.File; importjava.io.FileWriter; importjava.io.IOException; importjava.io.PrintWriter; importjava.text.SimpleDateFormat; importjava.util.Calendar; importjava.util.Date; publicclassTimerShutDownWindows{ /*检测是否需要关机的时间间隔*/ privatestaticlongm_nDetectInterval=5000; /*记录上次检测的时间,以毫秒为单位*/ privatestaticlongm_lLastMilliSeconds=0; /*可以使用电脑的最小小时*/ privatestaticintm_nUsePCMinHour=17; /*可以使用电脑的最大小时*/ privatestaticintm_nUseComputerMaxHour=23; /*如果分钟超过这个时间,则关机计算机*/ privatestaticintm_nMinutes=25; /*记录日志的文件的保存位置*/ privatestaticStringm_sLogFile="D:"+File.separator +"my_shutdown.log"; /*记录当前系统是否已经启动自动关闭程序*/ privatestaticbooleanbHasShutDownPC=false; /** *@paramargs */ publicstaticvoidmain(String[]args){ //1.单独开启一个线程去检测 ThreadaThread=newThread(newTimerDetector()); aThread.start(); } /** *定义内部类 * *@authorAdministrator * */ staticclassTimerDetectorimplementsRunnable{ /* *(non-Javadoc) * *@seejava.lang.Runnable#run() */ publicvoidrun(){ //1.获取日志文件 PrintWriterout=null; SimpleDateFormatdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); try{ out=newPrintWriter(newFileWriter(m_sLogFile,true),true); }catch(IOExceptione1){ out=null; e1.printStackTrace(); } //2.记录服务启动时间 appendLog(out,"服务启动时间:"+df.format(newDate())); while(true){ //1.判断当前系统时间是否被修改过 booleanbShoudShutDownPC=validateShoudShutDownPC(out); if(bShoudShutDownPC){ //验证没通过,强制关机 exectueShutDown(out); }else{ bHasShutDownPC=false; } //2.当前线程休眠下 try{ Thread.sleep(m_nDetectInterval); }catch(InterruptedExceptione){ appendLog(out,e.getMessage()); } } } /** *验证当前时间是否是需要关机的时间 * *@return */ privatebooleanvalidateShoudShutDownPC(PrintWriter_out){ //1.判断是否修改了系统时间 booleanbHasModifySystemTime=detectModifySytemTime(_out); appendLog(_out,"bHasModifySystemTime:"+bHasModifySystemTime); if(bHasModifySystemTime){ returnbHasModifySystemTime; } //2.没有修改系统时间,则判断当前时间是否超过了指定的时间 booleanbShoudSleep=nowIsSleepTime(); appendLog(_out,"bShoudSleep:"+bShoudSleep); if(bShoudSleep){ returnbShoudSleep; } returnfalse; } /** *判断当前时间是否应该休息的时间 * *@return */ privatebooleannowIsSleepTime(){ //1.获取当前小时和分钟 CalendaraCalendar=Calendar.getInstance(); intnHour=aCalendar.get(Calendar.HOUR_OF_DAY); intnMinute=aCalendar.get(Calendar.MINUTE); //2.判断当前小时是否在可以使用PC的时间内,最大小时为23 if(nHour<m_nUsePCMinHour){ returntrue; } //23点需要单独判断,超过23点30就应该休息 if((nHour>=m_nUseComputerMaxHour)&&(nMinute>=m_nMinutes)){ returntrue; } //3.非休息时间 returnfalse; } /** *判断是否有人修改了系统时间,如果有人修改了系统时间返回true,<BR> *否则返回false * *@return */ privatebooleandetectModifySytemTime(PrintWriter_out){ //1.第一次检测系统时间 if(m_lLastMilliSeconds==0){ m_lLastMilliSeconds=System.currentTimeMillis(); returnfalse; } //2.检测两次时间的差值 longlInteral=System.currentTimeMillis()-m_lLastMilliSeconds; lInteral=Math.abs(lInteral); //3.判断两次的时间间隔,两次结果不一定完全等于m_nDetectInterval,允许误差为1分钟 longlMaxInterval=m_nDetectInterval+60*1000; appendLog(_out,"lInteral:::"+lInteral); appendLog(_out,"lMaxInterval:::"+lMaxInterval); if(lInteral>lMaxInterval){ //有人修改了系统时间,强制关机 returntrue; } //4.只有没人修改时间才记录上次检测时间 m_lLastMilliSeconds=System.currentTimeMillis(); returnfalse; } /** *在指定的流中写入日志信息 * *@param_outWriter *@param_sAppendContent */ privatevoidappendLog(PrintWriter_outWriter,String_sAppendContent){ if(_outWriter==null){ return; } _outWriter.println(_sAppendContent); } /** *执行关机命令 */ privatevoidexectueShutDown(PrintWriter_out){ if(bHasShutDownPC){ SimpleDateFormatdf=newSimpleDateFormat( "yyyy-MM-ddHH:mm:ss"); appendLog(_out,"系统即将关闭,当前时间:"+df.format(newDate())); return; } appendLog(_out,"有人修改了系统时间,系统强制关机!"); //关机 try{ Runtime.getRuntime().exec( "shutdown-s-t120-c/"很晚了,该睡觉了,2分钟后关闭计算机。/""); }catch(IOExceptione){ appendLog(_out,e.getMessage()); } bHasShutDownPC=true; } } }
希望本文所述对大家的Java程序设计有所帮助。