java中电脑关机编码怎么写_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 -install myshutdownservice "%java_home%"/jre/bin/server/jvm.dll -djava.class.path="%java_home%"/lib/tools.jar;d:/software/javaservice-2.0.10/classes -start com.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)  启动服务

当我们注册完服务后,我们可以通过命令“net start myshutdownservice ”来启动该服务,服务启动后会在d 盘根目录生成my_shutdown.log 日志文件。

2)  关闭服务

如果我们要关闭服务,可以通过命令“net stop myshutdownservice ”来关闭该服务。

3)  删除服务

当我们想删除该服务时,可以使用命令“sc delete myshutdownservice ”来删除该服务。

2. 定时关机代码

package com.test.timer;

import java.io.file;

import java.io.filewriter;

import java.io.ioexception;

import java.io.printwriter;

import java.text.simpledateformat;

import java.util.calendar;

import java.util.date;

public class timershutdownwindows {

/* 检测是否需要关机的时间间隔 */

private static long m_ndetectinterval = 5000;

/* 记录上次检测的时间,以毫秒为单位 */

private static long m_llastmilliseconds = 0;

/* 可以使用电脑的最小小时 */

private static int m_nusepcminhour = 17;

/* 可以使用电脑的最大小时 */

private static int m_nusecomputermaxhour = 23;

/* 如果分钟超过这个时间,则关机计算机 */

private static int m_nminutes = 25;

/* 记录日志的文件的保存位置 */

private static string m_slogfile = "d:" + file.separator

+ "my_shutdown.log";

/* 记录当前系统是否已经启动自动关闭程序 */

private static boolean bhasshutdownpc = false;

/**

* @param args

*/

public static void main(string[] args) {

// 1. 单独开启一个线程去检测

thread athread = new thread(new timerdetector());

athread.start();

}

/**

* 定义内部类

*

* @author administrator

*

*/

static class timerdetector implements runnable {

/*

* (non-javadoc)

*

* @see java.lang.runnable#run()

*/

public void run() {

// 1. 获取日志文件

printwriter out = null;

simpledateformat df = new simpledateformat("yyyy-mm-dd hh:mm:ss");

try {

out = new printwriter(new filewriter(m_slogfile, true), true);

} catch (ioexception e1) {

out = null;

e1.printstacktrace();

}

// 2. 记录服务启动时间

appendlog(out, " 服务启动时间:" + df.format(new date()));

while (true) {

// 1. 判断当前系统时间是否被修改过

boolean bshoudshutdownpc = validateshoudshutdownpc(out);

if (bshoudshutdownpc) {

// 验证没通过,强制关机

exectueshutdown(out);

} else {

bhasshutdownpc = false;

}

// 2. 当前线程休眠下

try {

thread.sleep(m_ndetectinterval);

} catch (interruptedexception e) {

appendlog(out, e.getmessage());

}

}

}

/**

* 验证当前时间是否是需要关机的时间

*

* @return

*/

private boolean validateshoudshutdownpc(printwriter _out) {

// 1. 判断是否修改了系统时间

boolean bhasmodifysystemtime = detectmodifysytemtime(_out);

appendlog(_out, "bhasmodifysystemtime :" + bhasmodifysystemtime);

if (bhasmodifysystemtime) {

return bhasmodifysystemtime;

}

// 2. 没有修改系统时间,则判断当前时间是否超过了指定的时间

boolean bshoudsleep = nowissleeptime();

appendlog(_out, "bshoudsleep :" + bshoudsleep);

if (bshoudsleep) {

return bshoudsleep;

}

return false;

}

/**

* 判断当前时间是否应该休息的时间

*

* @return

*/

private boolean nowissleeptime() {

// 1. 获取当前小时和分钟

calendar acalendar = calendar.getinstance();

int nhour = acalendar.get(calendar.hour_of_day);

int nminute = acalendar.get(calendar.minute);

// 2. 判断当前小时是否在可以使用pc 的时间内, 最大小时为23

if (nhour < m_nusepcminhour) {

return true;

}

// 23 点需要单独判断,超过23 点30 就应该休息

if ((nhour >= m_nusecomputermaxhour) && (nminute >= m_nminutes)) {

return true;

}

// 3. 非休息时间

return false;

}

/**

* 判断是否有人修改了系统时间,如果有人修改了系统时间返回true ,

* 否则返回false

*

* @return

*/

private boolean detectmodifysytemtime(printwriter _out) {

// 1. 第一次检测系统时间

if (m_llastmilliseconds == 0) {

m_llastmilliseconds = system.currenttimemillis();

return false;

}

// 2. 检测两次时间的差值

long linteral = system.currenttimemillis() - m_llastmilliseconds;

linteral = math.abs(linteral);

// 3. 判断两次的时间间隔, 两次结果不一定完全等于 m_ndetectinterval ,允许误差为1 分钟

long lmaxinterval = m_ndetectinterval + 60 * 1000;

appendlog(_out, "linteral :::" + linteral);

appendlog(_out, "lmaxinterval :::" + lmaxinterval);

if (linteral > lmaxinterval) {

// 有人修改了系统时间,强制关机

return true;

}

// 4. 只有没人修改时间才记录上次检测时间

m_llastmilliseconds = system.currenttimemillis();

return false;

}

/**

* 在指定的流中写入日志信息

*

* @param _outwriter

* @param _sappendcontent

*/

private void appendlog(printwriter _outwriter, string _sappendcontent) {

if (_outwriter == null) {

return;

}

_outwriter.println(_sappendcontent);

}

/**

* 执行关机命令

*/

private void exectueshutdown(printwriter _out) {

if (bhasshutdownpc) {

simpledateformat df = new simpledateformat(

"yyyy-mm-dd hh:mm:ss");

appendlog(_out, " 系统即将关闭, 当前时间:" + df.format(new date()));

return;

}

appendlog(_out, " 有人修改了系统时间,系统强制关机!");

// 关机

try {

runtime.getruntime().exec(

"shutdown -s -t 120 -c /" 很晚了,该睡觉了,2 分钟后关闭计算机。/"");

} catch (ioexception e) {

appendlog(_out, e.getmessage());

}

bhasshutdownpc = true;

}

}

}

希望本文所述对大家的java程序设计有所帮助。

希望与广大网友互动??

点此进行留言吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值