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程序设计有所帮助。