主程序都一样,调用readString()方法,下面介绍3种不同的readSrting

public static void main(String[] args) { 
        String str = readString("请输入字符串:"); 
        System.out.println("readString 方法的输入:" + str); 
    }

方法一

JDK 1.4 及以下的版本中要想从控制台中输入数据只有一种办法,即使用System.in 获得系统的输入流,再桥接至字符流从字符流中读入数据。示例代码如下:


private static String readString(String prompt) { 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
        String str = null; 
        try { 
            System.out.print(prompt); 
            str = br.readLine(); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
        return str; 
    }


采用了BufferedReader 类来进行处理,而且在读取的过程中还需要捕获IOException 。不过这是 JDK 1.4 及以下版本中从控制台读取数据唯一的办法,比较麻烦,不推荐使用。

方法二

从 JDK 5.0 开始,基本类库中增加了java.util.Scanner 类,根据它的 API 文档说明,这个类是采用正则表达式进行基本类型和字符串分析的文本扫描器。使用它的Scanner(InputStream source) 构造方法,可以传入系统的输入流System.in 而从控制台中读取数据。


private static String readString5(String prompt) { 
        Scanner scanner = new Scanner(System.in); 
        System.out.print(prompt); 
        return scanner.nextLine(); 
    }

从代码量上来看,Test3 比Test1 少了很多的代码,核心代码只有两行。其实并不是Scanner 将控制台输入给简单化了,只是在其内部的实现中已经将IOException 处理了,而且采用InputStreamReader 来一个字符一个字符进行扫描读取的(嘿嘿,它本身就是个扫描器),只是Scanner 做了更高层次的封装。


Scanner 不仅可以从控制台中读取字符串,还可以读取除char 之外的其他七种基本类型和两个大数字类型,并不需要显式地进行手工转换。Scanner 不单单只能扫描控制台中输入的字符,它还可以让读入的字符串匹配一定的正则表达式模式,如果不匹配时将抛出InputMismatchException 异常。


使用System.in 作为它的构造参数时,它只扫描了系统输入流中的字符。它还有其他的构造,分别可以从文件或者是字符串中扫描分析字符串的,具体的使用方法可以参考 API 文档说明。

方法三

从 JDK 6.0 开始,基本类库中增加了java.io.Console 类,用于获得与当前 Java 虚拟机关联的基于字符的控制台设备。在纯字符的控制台界面下,可以更加方便地读取数据。示例代码如下:

private static String readString6(String prompt) { Console console = System.console(); if (console == null) { throw new IllegalStateException("不能使用控制台"); } return console.readLine(prompt); } }


在Test1 和Test3 中,输入数据前的提示信息需要使用System.out.print(); 来输出,但是使用基于Console 的Test4 类,可以在方法参数中直接放入提示信息。

总的来说:

JRE 1.4 或以下版本的情况下,没得选择只能采用Test1 或者是非控制台读入的Test2 的方法。

JRE 5.0 的情况下,建议使用基于Scanner 的Test3 的方法,更方便地进行数据读取。

JRE 6.0 的情况,并且只在字符界面的控制台下运行时,采用Test4 的方法,如果需要读入像密码之类的敏感数据,为了安全性考虑也必须使用Test4 或者是自行实现。如果需要读入除字符串类型之外的其他数据类型,建议使用基于Scanner 的控制台输入。