分享一下我写的java监听控制台输入并可以给出响应的功能。

很多时候需要监听控制台的输入内容,相当于信号监听,根据输入的内容做出相应的动作,这里给出我的一个简单实现。

要注意的是:监听得到的消息中前后的空格和中间连续的多个空格会被忽略只保留一个空格,不区分大小写。

package com.idealisan.cores;

import java.util.HashMap;
import java.util.Scanner; public class ConsoleListener {
HashMap<String, Action> answers = new HashMap<String, ConsoleListener.Action>();
Scanner scanner;
Action defaultAction; /**
* Add an action for a message.
* @param message A string trimed. Ignore case. It has no inner space sequence of two spaces or more.
* Example:"close connection"
* @param action The method action.act() will be called when scanner get the message.
*/
public void addAction(String message, Action action) {
answers.put(message.toLowerCase(), action);
} /**
*
* @param scanner Usually new Scanner(System.in).
* Will not be closed after listening.
* @param defaultAction The defaultAction.act() method will be called if an action is not added for a message.
*/
public ConsoleListener(Scanner scanner, Action defaultAction) {
this.scanner = scanner;
this.defaultAction = defaultAction; if (scanner == null || defaultAction == null) {
throw new NullPointerException("null params for ConsoleListener");
}
} public void removeAction(String message, Action action) {
answers.remove(message, action);
} public Action replaceAction(String message, Action action) {
return answers.replace(message, action);
} public void listenInNewThread() {
Thread t = new Thread() {
public void run() {
listen();
}
};
t.start();
} /**
* Use listenInNewThread() instead.
* Listen to console input in current thread. It blocks the thread.
*/
public void listen() {
while (true) {
String line = scanner.nextLine();
String msg = line.replaceAll("[\\s]+", " ");
msg = msg.trim().toLowerCase();
Action action = answers.get(msg);
if (action == null) {
action = defaultAction;
} action.act(line); }
} public static interface Action {
public void act(String msg);
}
}

演示:

package com.idealisan.test;

import java.util.Scanner;

import com.idealisan.cores.ConsoleListener;

/**
* Hello world!
*
*/
public class App {
public static void main(String[] args) {
ConsoleListener cs = new ConsoleListener(new Scanner(System.in), new ConsoleListener.Action() { public void act(String msg) {
System.out.println("Console: " + msg);
}
});
cs.addAction("stop", new ConsoleListener.Action() { public void act(String msg) {
System.out.println("Console: Bye");
System.exit(0);
}
});
cs.addAction("stop repeating", new ConsoleListener.Action() { public void act(String msg) {
System.out.println("Console: ...");
}
});
cs.listenInNewThread(); while (true) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
}

java 监听控制台输入的更多相关文章

  1. Android EditText的输入监听,输入字符的动态获取

    http://itindex.net/detail/38974-android-edittext-%E7%9B%91%E5%90%AC 有时候我们可能会用到时时的监听EditText输入字符的时时监听 ...

  2. 实时监听input输入内容的N种方法

    现在有一个需求,需要我们实时监听input输入框中的内容,从而带来更好的用户体验,而不是等我们全部输入完毕才告诉我们格式不对首先我们创建一个input输入框 <form name='loginF ...

  3. Java监听模式

    说明 生活中,监听无处不在.比如说,手机播放音乐功能,也是一种监听:你不点击播放按钮,手机就不放歌,当你点击时,手机就播放音乐.即触发某种行为,便执行相应的动作. 组成 Java监听模式右三个部分组成 ...

  4. java监听事件

    2014年2月23日 09:51:54 成功添加了打开官网的事件, 回头研究下,那个打开url的类 java的System.getProperty()方法可以获取的值 ################ ...

  5. 使用jQuery监听扫码枪输入并禁止手动输入的实现方法

    @(知识点总结)[jquery|扫码抢] 基于jQuery的扫码枪监听.如果只是想实现监听获取条码扫码信息,可以直接拿来使用,如果有更多的条码判断处理逻辑需要自己扩展. 一.功能需求 使用扫码枪扫描条 ...

  6. 微信小程序监听input输入并取值

    小程序的事件分为两种,冒泡和非冒泡事件,像<form/>的submit事件,<input/>的input事件,<scroll-view/>的scroll事件等非冒泡 ...

  7. 实时监听input输入的变化(兼容主流浏览器)【转】

    遇到如此需求,首先想到的是change事件,但用过change的都知道只有在input失去焦点时才会触发,并不能满足实时监测的需求,比如监测用户输入字符数. 在经过查阅一番资料后,欣慰的发现firef ...

  8. [转] 实时监听input输入的变化(兼容主流浏览器)

    遇到如此需求,首先想到的是change事件,但用过change的都知道只有在input失去焦点时才会触发,并不能满足实时监测的需求,比如监测用户输入字符数. 在经过查阅一番资料后,欣慰的发现firef ...

  9. java 监听文件或者文件夹变化的几种方式

    1.log4j的实现的文件内容变化监听 package com.jp.filemonitor; import org.apache.log4j.helpers.FileWatchdog; public ...

随机推荐

  1. Codeforces 816C/815A - Karen and Game

    传送门:http://codeforces.com/contest/816/problem/C 本题是一个模拟问题. 有一个n×m的矩阵.最初,这个矩阵为零矩阵O.现有以下操作: a.行操作“row  ...

  2. BALNUM - Balanced Numbers

    BALNUM - Balanced Numbers Time limit:123 ms Memory limit:1572864 kB Balanced numbers have been used ...

  3. mysql绑定多个ip地址

    http://jpuyy.com/2013/07/mysql-bind-multi-address.html mysql绑定多个ip地址 发表于2013 年 7 月 1 日 my.cnf中有选项bin ...

  4. 【ACM】nyoj_103_A+BII_201307291022

    A+B Problem II时间限制:3000 ms  |  内存限制:65535 KB 难度:3描述 I have a very simple problem for you. Given two ...

  5. 命令行使用Eclipse的debug签名失败“找不到 xx.keystore证书链”

    1.debug签名位置 2.查看debug.keystore具体信息 3.使用命令行签名 注意:debug签名password为android 4.出错原因是签名的别名写错,应为androiddebu ...

  6. 拓扑排序---AOV图

    对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中全部顶点排成一个线性序列, 使得图中随意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出如 ...

  7. struts1——静态ActionForm与动态ActionForm

    在struts1中,我们能够使用ActionForm来获取从client端提交上来的数据.并通过action配置中的name属性.将某个ActionForm配置到某次请求应答的Action中.作为本次 ...

  8. PL SQL Developer client 连接server

    安装完Oracle,PLSQL之后,在server中打开监听. 计算机右键-管理-服务和应用程序-服务-打开以Oracle开头的服务,特别是监听,这个最重要.详细如图所看到的. (1)配置监听的位置 ...

  9. GIS中mybatis_CMEU的配置方法

    基本常用功能预览: 生成实体类(可以自定义:get/set,有参无参构造方法,自定义类型与属性,序列化等); 生成dao层接口(查询全部信息,通过ID查询信息,插入全部属性,插入不为空的属性,通过ID ...

  10. ubuntu系统源的更新

    以前没有注意,ubuntu的系统的源原来每次在GUI操作后都会追加在后面而不是覆盖,比如先添加了上海交大的源那么后来如果发现很慢下载不了,而这个包已经在apt-cache里面了,下次如果要instal ...