java 监听控制台输入

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

    }
}

 

 

posted @ 2019-06-25 15:42  sebastia  阅读(3168)  评论(0编辑  收藏  举报