java语句电脑定时关机_java实现电脑定时关机的方法
Java能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。下面是小编收集的关于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实现电脑定时关机的方法】相关文章:
java语句电脑定时关机_java实现电脑定时关机的方法相关推荐
- java获取网络ip地址_Java获取电脑真实IP地址的示例代码
/** * @author yins * @date 2018年8月12日下午9:53:58 */ import java.net.Inet4Address; import java.net.Inet ...
- java语句以什么结尾_Java程序语句结尾必须以英文字符(???? ?)结尾。
Java程序语句结尾必须以英文字符(???? ?)结尾. 答:分号 中国大学MOOC: 就被子植物而言,世界上最大的花和最大种子为 答:大花草 海椰子 佶屈( )牙 答:聱 乾隆年间,三庆.四喜.和春 ...
- java未知变量的类型_Java语言中类、变量及方法的声明 | 学步园
类声明 [ public][ abstract][ final] class NameOfClass [ extends Super][ implements Interfaces] pubilc:声 ...
- java 根据日期获取天数_java获取日期之间天数的方法
//获取两个日期之间的天数 private int daysBetween(Date now, Date returnDate) { Calendar cNow = Calendar.getInsta ...
- java获取字符的编码_java获取文本文件字符编码的方法
java获取文本文件字符编码的方法 发布时间:2020-06-16 09:56:08 来源:亿速云 阅读:386 作者:Leah 这篇文章将为大家详细讲解有关java获取文本文件字符编码的方法,小编觉 ...
- java中如何读写文件_JAVA: 读写文件的几种方法
如果您使用java8,可以也参考这篇文章:JAVA: Java8流逐行读取文件 import java.io.BufferedReader; import java.io.BufferedWriter ...
- java for循环创建线程_Java创建线程的两种方法
大多数情况,通过实例化一个Thread对象来创建一个线程.Java定义了两种方式: 实现Runnable 接口: 可以继承Thread类. 下面的两小节依次介绍了每一种方式. 实现Runnable接口 ...
- java类和接口实例_Java定义泛型接口和类的方法实例分析
本文实例讲述了Java定义泛型接口和类的方法.分享给大家供大家参考,具体如下: 一 点睛 所谓泛型:就是允许在定义类.接口指定类型形参,这个类型形参在将在声明变量.创建对象时确定(即传入实际的类型参数 ...
- java构造方法可以重载吗_Java基础教程之构造器与方法重载
在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initialization).初始化时,对象的数据成员被赋予初始值.我们可以显式初始化.如果我们没有给数据成员赋予初始值,数据成员 ...
最新文章
- easyui 中combogrid 实现多选,反选效果
- 技术型产品经理与系统设计
- Winform中使用Mysql.Data.dll实现连接Mysql数据库并执行sql语句(排除ddl等非法语句的执行)
- JDK1.1 JDK1.2 JDK1.3 JDK1.4 JDK1.5 JDK1.6 JDK1.7
- 使用postman测试接口
- 远程调试tomcat
- JavaScript和jQuery的DOM操作
- 不同的核函数对支持向量机分类性能的影响
- CP2102 USB转串口驱动下载
- 三星堆的青铜机器人_三星堆“青铜纵目人像”到底是谁?专家终于讲出了真相...
- 在Windows Server 2003企业版下让移动硬盘自动显示盘符
- 【历史上的今天】9 月 28 日:“超级计算机之父”诞生;三星推出移动支付;LibreOffice 发布
- Math.h 正态分布 C语言,C++与正态分布(示例代码)
- 中国石油大学计算机应用基础在线考试答案,中国石油大学2020年春季《计算机应用基础》在线考试答卷附标准答案...
- mac framework
- matlab java堆内存溢出,matlab内存溢出的解决方案
- 码农场 » POJ 2566 Bound Found 题解 《挑战程序设计竞赛》
- 插入排序原理及实现思路
- C++面试技巧 大厂 某讯 面试试题
- [20140422]使用dgmgrl管理dataguard(14)