JAVA从控制台读数据的几种方法


1. 使用标准输入流:system.in (JDK 1.4 及以下版本唯一的读取方法)

System.in.read()一次只读入一个字节数据,返回一个整数,且必须初始化

其他类型数据需要手工转换

读取过程必须捕获IOException

  //int read = 0;
  char read = '0';
  System.out.println("输入数据:");
     try {
         //read = System.in.read();
         read = (char) System.in.read();
      }catch(Exception e){
            e.printStackTrace();
      }
  System.out.println("输入数据:"+read);

使用InputStreamReader获取标准输入流,再用字符流BufferedReader包装InputStreamReader

这种方法可以读取含空格/tab的字符串。

<span style="font-size:14px;">import java.io.IOException;
import java.io.InputStreamReader;

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

    /**
    * 使用系统的输入流,从控制台中读取数据<br/>
    * 用于所用的JDK版本
    * @param prompt 提示信息
    * @return 输入的字符串
    */

     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;
    }
 }</span>


2. 使用Scanner类(JDK 5.0 读取的方法)

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

<span style="font-size:14px;">import java.util.Scanner;

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

    /**
     * 使用扫描器类(Scanner)从控制台中读取字符串<br/>
     * 适用于JDK 5.0及以后的版本
     * @param prompt 提示信息
     * @return 输入的字符串
     */
    private static String readString5(String prompt) {
        Scanner scanner = new Scanner(System.in);
        System.out.print(prompt);
        return <span style="color:#FF0000;">scanner.nextLine</span>();
    }
}
</span>
在新增一个Scanner对象时需要一个System.in对象,因为实际上还是System.in在取得用户输入。Scanner的next()方法用以取得用户输入的字符串;nextInt()将取得的输入字符串转换为整数类型;同样,nextFloat()转换成浮点型;nextBoolean()转换成布尔型。


3.java.io.Console(JDK 6.0 )

从 JDK 6.0 开始,基本类库中增加了java.io.Console类,获得与当前 Java 虚拟机关联的基于字符的控制台设备。

<span style="font-size:14px;">import java.io.Console;
import java.util.Scanner;

public class Test4 {

    public static void main(String[] args) {      
        String str = readString6("请输入字符串:");
        System.out.println("readString6 方法的输入:" + str);
    }
    
    /**
     * 使用控制台类(Console)从控制台中读取字符串<br/>
     * 适用于JDK 1.6或以后的版本
     * @param prompt 提示信息
     * @return 输入的字符串
     */
    private static String readString6(String prompt) {
        Console console = System.console();
        if (console == null) {
            throw new <span style="color:#FF0000;">IllegalStateException</span>("不能使用控制台");
        }
        return <span style="color:#FF0000;">console.readLine</span>(prompt);
    }
}</span>

使用Console类的readPassword()方法可以在控制台上不回显地输入密码,并将密码结果保存在char数组中,根据 API 文档的建议,在使用后应立即将数组清空,以减少其在内存中占用的时间,以便增强安全性。

但是,Console也有一些缺点,根据ConsoleAPI 文档的说明:

虚拟机是否具有控制台取决于底层平台,还取决于调用虚拟机的方式。如果虚拟机从一个交互式命令行开始启动,且没有重定向标准输入和输出流,那么其控制台将存在,并且通常连接到键盘并从虚拟机启动的地方显示。如果虚拟机是自动启动的(例如,由后台作业调度程序启动),那么它通常没有控制台。

通过上面的文档说明可以看出,在使用 IDE 的情况下,是无法获取到Console实例的,原因在于在 IDE 的环境下,重新定向了标准输入和输出流,也是就是将系统控制台上的输入输出重定向到了 IDE 的控制台中。因此,在 IDE 中不能使用这个程序,而Test1Test3就没有这种限制。

4.

还有一种非控制台读入数据的办法,就是采用 Swing 中的JOptionPane,会弹出一个非常漂亮的输入对话框让使用者输入数据,但这是一种比较另类的做法,不推荐使用。

<span style="font-size:14px;">import javax.swing.JOptionPane;

public class Test2 {

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

    /**
     * 使用JOptionPane的输入对话框,输入字符串<br/>
     * 用于所用的JDK版本
     * @param prompt 提示信息
     * @return 输入的字符串
     */
    private static String readStringFromDialog(String prompt) {
        return JOptionPane.showInputDialog(prompt);
    }
}</span>


参考:http://blog.csdn.net/ttq9017/article/details/2170347


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值