现在的位置: 首页 > 综合 > 正文

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

2014年09月30日 ⁄ 综合 ⁄ 共 2354字 ⁄ 字号 评论关闭

如何接收控制台输入的指令?可以用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>

应用场景:通过在控制台输入指令的方式控制一些操作,例如初始化数据库!!!

抱歉!评论已关闭.