三种Java从控制台读数据方法

来源:互联网 发布:淘宝买家下订单骗卖家 编辑:程序博客网 时间:2024/04/29 17:08

主程序都一样,调用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 的控制台输入。