如何在允许超时时间内接受来自控制台输入的指定指令

来源:互联网 发布:adaboost人脸检测算法 编辑:程序博客网 时间:2024/05/22 00:11

如何接收控制台输入的指令?可以用System.in很容易的实现,但是如何实现在超时时间内接收来自控制台输入的指定指令.直接看代码和测试类。

<span style="font-size:12px;">package com.ilucky.console.detecotr;import java.io.InputStream;/** * @author IluckySi * @date 20140723 */public class ConsoleDetectorUtil {private int timeoutMillis;private String command;public void setTimeoutMillis(int timeoutMillis) {this.timeoutMillis = timeoutMillis;}public void setCommand(String command) {if(command.length() <= 0) {try {throw new Exception("指令长度不能为0");} catch (Exception e) {e.printStackTrace();}}this.command = command;}public boolean readInputStreamWithTimeout() {boolean result = true;System.out.println("等待控制台输入指令(" + command + "), 开始初始化数据库操作:");//定义指令长度.byte[] consoleCommandByte = new byte[command.length()];//获取从控制台输入的指令长度.int readLength = 0;try {//读取数据偏移量.int bufferOffset = 0;//计算过期时间. long maxTimeMillis = System.currentTimeMillis() + timeoutMillis; //获取控制台输入流. InputStream is = System.in; //轮询控制台,获取控制台在timeoutMillis时间内输入的指令.  while (System.currentTimeMillis() < maxTimeMillis && bufferOffset < command.length()) {   //重点: 将控制台输入的指令写进字节数组.          readLength = Math.min(is.available(), command.length() - bufferOffset);           int readResult = is.read(consoleCommandByte, bufferOffset, readLength);          bufferOffset += readResult;     }//判断在timeoutMillis时间内从控制台输入的指令是否为command.char[] commandByte = command.toCharArray();if(readLength > 0) {for(int i = 0; i < consoleCommandByte.length; i++) {byte b = consoleCommandByte[i];char c = (char)b;if(c != commandByte[i]) {result = false;break;}}} else {result = false;}} catch (Exception e) {System.out.println("ConsoleDetectorUtil出现未知异常" + e.toString());}return result;}}</span>
<span style="font-size:12px;">package com.ilucky.console.detecotr;/** * @author IluckySi * @date 20140723 */public class MainTest {public static void main(String[] args) {ConsoleDetectorUtil cdu = new ConsoleDetectorUtil();String command = "yes";cdu.setCommand(command);cdu.setTimeoutMillis(5000);boolean result = cdu.readInputStreamWithTimeout();if(result == true) {System.out.println("接受控制台指令(" + command + "), 开始初始化数据库操作!");//省略业务操作: 初始化数据库.} else {System.out.println("未接受控制台指令(" + command + "), 忽略初始化数据库操作!");}}}/** 输出结果: java.lang.Exception: 指令长度不能为0等待控制台输入指令(), 开始初始化数据库操作:未接受控制台指令(), 忽略初始化数据库操作!at com.ilucky.console.detecotr.ConsoleDetectorUtil.setCommand(ConsoleDetectorUtil.java:22)at com.ilucky.console.detecotr.MainTest.main(MainTest.java:12)*等待控制台输入指令(yes), 开始初始化数据库操作:test未接受控制台指令(yes), 忽略初始化数据库操作!&等待控制台输入指令(yes), 开始初始化数据库操作:yes接受控制台指令(yes), 开始初始化数据库操作!*/</span>
应用场景:通过在控制台输入指令的方式控制一些操作,例如初始化数据库!!!

0 0
原创粉丝点击