分享一下我写的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. Maven学习总结(26)——maven update时,报:Preference node "org.eclipse.wst.validation"...

    详细情况如下: An internal error occurred during: "Updating Maven Project". Preference node " ...

  2. Co-prime

    Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem ...

  3. Spring Boot 定时任务单线程和多线程

    Spring Boot 的定时任务: 第一种:把参数配置到.properties文件中: 代码: package com.accord.task; import java.text.SimpleDat ...

  4. [bzoj4084][Sdoi2015]双旋转字符串_hash

    双旋转字符串 bzoj-4084 Sdoi-2015 题目大意:给定两个字符串集合 S 和 T .其中 S 中的所有字符串长度都恰好为 N ,而 T 中所有字符串长度都恰好为 M .且 N+M 恰好为 ...

  5. hdu5326 Work

    题目链接:点击打开链接 题目大意:有n个人.各自管理不同的人,问有多少人管理k个人. 思路:先记录每一个人的直接上级.然后模拟路径压缩的过程进行计数求和. #include<stdio.h> ...

  6. iOS 8 中 UIAlertView 和 UIActionSheet 河里去了?

    iOS 8 中 UIAlertView 和 UIActionSheet 河里去了? 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商 ...

  7. 浅谈搜狐云景PAAS平台

    前言: 搜狐云景作为搜狐的paas平台,在2014年5月22日的云计算大会上正式公布了公測.初測,注冊用户必须先申请邀请码參与公測会赠送用户100元电子券,经过实名认证之后会再赠送100电子券.目測能 ...

  8. luogu1967 货车运输 最大瓶颈生成树

    题目大意 给出一张图,给出q对点,求这两个点间权值最小边最大的路径,输出这个最小边权. 题解 我们先一条一条边建图.当建立的边使得图中形成环时,因为环中的每个节点只考虑是否连通和瓶颈大小,要想互相连通 ...

  9. luogu4011 孤岛营救问题 分层图

    关键词:分层图 状态压缩 最短路径 分层图:现在要求从起点到终点的最优路线,但受到手里拿着哪些钥匙的影响,最优路线不单纯了.因此,决定一个节点.一条边的存在的数中应当增加一个手中拿有钥匙的状态.这样就 ...

  10. vue组件的3种书写形式

    第一种使用script标签 <!DOCTYPE html> <html> <body> <div id="app"> <my- ...