分享一下我寫的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(); } } } }