« | August 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | | | | |
| 公告 |
戒除浮躁,读好书,交益友 |
Blog信息 |
blog名称:邢红瑞的blog 日志总数:523 评论数量:1142 留言数量:0 访问次数:9694524 建立时间:2004年12月20日 |

| |
[java语言]未公开的mustang核心秘密(六):控制台的输入  原创空间, 软件技术, 电脑与网络
邢红瑞 发表于 2007/7/28 11:31:51 |
在jdk6出来之前,从控制台输入密码是件及其困难的事情,Sun的网站以前有篇文章是讲jdk6之前如何处理密码输入,该解决方案是用多线程来处理,一个线程专门刷新屏幕输入,防止密码被显示,不知道当年webloigc是如何解决的。或者使用JNI解决,使用JNI时不要用env -> NewStringUTF(str);,这样密码是中文就有问题的,如何解决看我以前的blog。JDK6.0有一个新类Console,可以解决这个问题
package test;
import java.io.Console;
public class Input { public static void main(String args[]) { Console console = System.console(); if (console == null) { //但是在某些情况下System.console()返回一个null。比如输入被重定 System.err.println("Console not available"); return; } System.console().printf("%s", new Object[] { new String("Enter user:") }); String user = new String(console.readLine()); // 读取整行字符 System.console().printf("%s", new Object[] { new String("Enter passowrd:") }); String pwd = new String(console.readPassword()); // 读取密码,密码输入时不会显示 console.printf("User is:%s\n", new Object[] { user }); console.printf("Password is:%s\n", new Object[] { pwd }); }}说明:Console类所提供的方法可以访问与当前虚拟机相关联的基于字符的控制台设备。但是在调用这些方法之前,需要首先调用 System的public static Console console()方法来获取一个Console对象。该方法将返回一个用来与控制台设备交互的Console对象,但是如果控制台设备不存在就会返回 null,例如当你重定向标准输入或标准输出(或二者皆有)的时候。如果控制台设备是存在的,你可以从控制台输入流读取密码和整行的字符,还可以向控制台输出流写入字符。为了读取密码(而不会将密码字符显示到控制台输出流),你必须调用Console的两个readPassword()方法之一。这两个方法不允许换行符作为密码的一部分,如果达到了控制台输入流的字符数目限制,他们将返回null。在密码被存储到pwd之后,就可以按需使用了。然而,出于安全性考虑,应该不能用String,因为他会在虚拟机分配的,在不需要使用密码的时候,应该将pwd清零。除了readPassword()方法之外,Console提供了两个readLine()方法以便于从控制台读取一整行的字符,并且将这些字符(不包括换行符)存储在一个String中。如果达到了控制台输入流的字符数目限制,这两个方法都将返回null。关于两个readPassword()方法和两个readLine()方法有一些有趣的事。当这些方法遇到输入/输出错误时,它们不抛出 java.io.IOException对象(例如会被System.in.read()抛出),而是抛出一个java.io.IOError对象。由于 IOError是Error的子类,你无需像捕捉IOException那样来捕捉这个对象。向控制台输出流输出字符的配套方法是public Console format(String fmt, Object... args)和作用相同的public Console printf(String fmt, Object... args)方法,后者内部调用了format()。注意:控制台对象与唯一的一个java.io.Reader对象和唯一的一个java.io.PrintWriter对象相关联。调用控制台的public Reader reader()方法可以返回Reader。例如你可以把Reader传递给java.util.Scanner的一个构造函数来对控制台输入流进行复杂的解析。调用控制台的public PrintWriter writer()方法可以获取PrintWriter。然后你可以调用各种各样有用的方法来输出不同类型的数据到控制台上。为方便起见,控制台提供了一个 public void flush()方法来调用PrinterWriter的flush()方法。 |
|
回复:未公开的mustang核心秘密(六):控制台的输入 原创空间, 软件技术, 电脑与网络
娱乐(游客)发表评论于2007/8/14 19:14:13 |
时尚圈的人们都在津津乐道时尚与舞蹈的亲密接触,作为最优美舞蹈代表的芭蕾舞演员们,他们的世界依然保持高贵的灵魂。在他们心目中,“单单‘我是个芭蕾舞演员’这句话,对我意义就非常大。”6月底,上海芭蕾舞团主要演员吴虎生获得了第九届纽约国际芭蕾舞比赛男子组第一名,人们的目光一下子聚焦在上海芭蕾舞团那些优雅的演员身上。8月6日,《外滩画报》特约五位上芭的主要演员和独舞演员,对他们进行了一次群访。这些年轻的男孩女孩鱼贯走进摄影棚,给整个空间带来了光彩熠熠的氛围。他们的艺术指导辛丽丽非常骄傲地说:“他们本来就是明星!” |
|
» 1 »
|