首页 | 源码下载 | 网站模板 | 网页特效 | 广告代码 | 网页素材 | 字体下载 | 书库 | 站长工具
会员投稿 投稿指南 RSS订阅
当前位置:主页>网络编程>java教程>资讯:关于Java命令行交互方式

关于Java命令行交互方式

www.jz123.cn  2008-12-01   来源:   中国建站    编辑整理    我要投递新闻

普通的程序交互方式有命令行和GUI形式。对于GUI样式,交互的设计可以多种多样,但是Java做命令行交互,似乎存在着一些不足。

 

普通的程序交互方式有命令行和GUI形式。对于GUI样式,交互的设计可以多种多样,但是Java做命令行交互,似乎存在着一些不足。

命令行交互是传统的交互方式,如果程序有时候需要在Unix或是Linux等系统上运动时,以这种方式出现的可能性就比较大。命令行包括

输入和回显问题,一般是以行结束,或是以某个结束符为终命令终止标识。System.out 和System.err就用于标准的输出和错误输出,System.in用于标准的输入接受,一般情况下都是指键盘。

如果接受参数输入,一般的程序结构如下:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

System.out.println("==Please input password==:");

String pass = in.readLine(); 输入的时候显示屏自动进行输入回显。这个时候如果遇到输入密码等敏感数据的时候,就无法用*或是#这样的符号进行回显屏蔽,容易暴露安全问题。

解决的可能想法:

1、通过监听键盘事件,对输入的回显进行截获取,把回显进行屏蔽,但是监听器如何知道何时是输入密码,何时是输入普通数据?比较难以控制,而且这种监听应该是线程化的,可能会存在一些意想不到的问题。

2、如果用纯Java难以实现,那么是否可以使用其它语言的功能进行补充,比如JNI,或是Windows下面的Dos脚本,Linux平台的Shell脚本来进行补充。不过这样就不太平台无关了。

3、可能sun发现了这个不足之处,从1.6版本开始,增加了一个java.io.Console类,代表与当前 Java 虚拟机关联的基于字符的控制台设备,这个Console是对原来System.in这种不足的补充,提供了像readPassword()等这样的实用方法,具体请参考API文档,就是专门用于对敏感信息的读取。但是这是基于Java1.6的,如果有些场景受限制,不能使用1.6,那么还是无法解决上面的问题。后来查阅了一下Console类的实现方式,想直接把它的实现方式移植到1.4.xx上是比较难的,因为用到了一些高版本的新特性。使用Console要注意的是:虚拟机是否具有控制台取决于底层平台,还取决于调用虚拟机的方式。如果虚拟机从一个交互式命令行开始启动,且没有重定向标准输入和输出流,那么其控制台将存在,并且通常连接到键盘并从虚拟机启动的地方显示。如果虚拟机是自动启动的(例如,由后台作业调度程序启动),那么它通常没有控制台。如果你在Eclipse里面启动程序调用Console,那么通常是没有控制台,还是得从外部的命令行方式才能调用得到。

总体想一下,感觉应该还是从第2点出发,牺牲掉一点通用性,这样才能满足这种功能需求。

[作者:nighty]

上一篇:Spring中事件处理的小技巧 下一篇:j2ee性能调优之最小化资源压力测试法则

评论总数:1 [ 查看全部 ] 网友评论


关于我们隐私版权广告服务友情链接联系我们网站地图