jdk6:System.console()简介

最近再考SCJP的认证,看得资料是055的,想考065,结果在做试题的时候发现了一些新东西。是jdk6的新增东西,原题如下:

Given:
import java.io.Console;
public class TestThis implements Runnable {
	public static void main(String[] args) {
		Thread t=new Thread(new TestThis());
		t.start();
		Thread t2=new Thread(new TestThis());
		t2.start();
		Console c=System.console();
		String u=c.readLine("%s","m ");
		System.out.print(u+"");
	}
	public void run() {
		Console c=System.console();
		Console c=System.console();
		String u=c.readLine("%s","t ");
		System.out.print(u+"");
	}
}

What is the result?(Choose all that apply)
A:Compilation fails.
B:A NullPointerException is never thrown.
C:A NullPointerException is always thrown.
D:A NullPointerException is sometimes thrown.

 

其中的原因是控制台对象并不是每次都能分配得的到的,视具体的环境而定。

下面是转载的资料(http://developer.51cto.com/art/200907/135170.htm),看一下就明白了:

JDK 6中提供了java.io.Console类专用来访问基于字符的控制台设备。如果你的Java程序要与Windows下的cmd或者Linux下的Terminal交互,就可以用这个Java Console类代劳。

TestConsole.java 代码:

package com.simon.testjdk6.console;    
import java.io.Console;           
public class TestConsole {             
  /**          * @param args          */     
    public static void main(String[] args) {         
         Console console = System.console(); // 获得Console实例对象             
      if (console != null) { // 判断是否有控制台的使用权                  
          String user = new String(console.readLine("Enter username:"));// 读取整行字符                  
          String pwd = new String(console.readPassword("Enter passowrd:"));   // 读取密码,输入时不显示   
          console.printf("Username is: " + user + "\n");// 显示用户名                  
          console.printf("Password is: " + pwd + "\n");   // 显示密码     
      } else {     
                 System.out.println("Console is unavailable.");  // 提示无控制台使用权限            
      }            
   }        
}     

Java要与Console进行交互,不总是能得到可用的Java Console类的。一个JVM是否有可用的Console,依赖于底层平台和JVM如何被调用。如果JVM是在交互式命令行(比如Windows的cmd)中启动的,并且输入输出没有重定向到另外的地方,那么就我们可以得到一个可用的Console实例。

当你有Eclipse或NetBean中运行以上代码时Console中将会有以下文字输出:

Console is unavailable.

 表示Java程序无法获得Console实例,是因为JVM不是在命令行中被调用的,或者输入输出被重定向了。

在控制台中运行代码,效果将如下所示:

 

 

$ java com.simon.testjdk6.console.TestConsole 
Enter user:Simon  
Enter passowrd:  
User is:Simon  
Password is:12345 

我们可以看到:输入密码时,控制台时不显示我们所输入的密码字符。但是程序可以得到并输出的密码字符串。这就是JDK 6中新增的Java Console类的运行方式。

或者在这里也会看到相关资料:http://wangyu.iteye.com/blog/193466

你可能感兴趣的:(java,jvm,C++,c,C#)