Java的新手经常问,“我怎样才能从命令行读取一个整数呢?”他们遇到的问题是双重性的。第一个问题是Java 把命令行当成是字符输入的地方,比方“1”而不是1.第二个方面是从命令行读取数据需要一个非常陡峭的学习曲线。幸运的是,使用一个简单的Listener系统,学习曲线的坡度被降低了而程序员可以关注于真正的问题,也就是如何把输入的字符串转换成数字。
<script language=JavaScript1.1 src="http://ad.cn.doubleclick.net/adj/messagingplus.zdnet.com.cn/developer/code;sz=1x1;ord=1119171422?"> </script> <script language=VBScript> on error resume next ShockMode = (IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash.6"))) </script> |
更有经验的开发者也可以从这个系统中得到好处,因为它封装了命令行的InputStream API,把它隐藏在一个更合乎逻辑的API后。这使得将一个组件进行转换让它在GUI环境下运行而不需要重载STDIN成为可能。
ener类包含一个单一的cmdEntered(String)方法。通过返回false值,Listener能够指示命令行已经读取完毕。
我们讨论的List
package com.generationjava.io;
/**
* 监听一个命令行而且在命令被输入的
*时候收到通知。从cmdEntered返回false值将
*将阻止被监听的命令行。
*/
public interface CommandLineListener {
public booleancmdEntered(String cmd);
}
package com.generationjava.io;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.Reader;
import java.io.InputStreamReader;
import java.io.InputStream;
/**
* 从命令行读取命令
* 这使得处理用户命令的程序可以
*与读取命令的部分独立开来
*/
public class CommandLine {
private BufferedReaderbr = null;
private CommandLineListenermyListener = null;
public CommandLine(InputStream is, CommandLineListenercll) {
this( new InputStreamReader(is), cll);
}
public CommandLine(Reader rdr, CommandLineListenercll) {
br = new BufferedReader(rdr);
myListener = cll;
}
public void startReading() throws IOException {
String cmd = null;
booleanmoreCommands = true;
while(moreCommands) {
cmd = br.readLine();
moreCommands = myListener.cmdEntered(cmd);
}
}
}
使用这个系统是简单的。只需要实现Listener类然后开始一个命令行对象。例如:
public class TestCommandLine implements CommandLineListener {
static public void main(String[] args) {
CommandLineListenercll = new TestCommandLine();
CommandLinecl = new CommandLine( System.in, cll );
cl.startReading();
}
public booleancmdEntered(String cmd) {
System.out.println("CMD["+cmd+"] was entered.");
return true;
}
}
还有一些明显的方法能够改进上面的两个类。可以向cmdEnted传递CommandEvent对象而不是String对象。CommandLine允许使用多个CommandLineListener,而且它能够在一个线程里执行以便在它等待用户输入的时候不会阻塞系统的其它部分。但是,它简化并封装了命令行的输入过程,使得开发过程能够简单些。