Java 字符终端上获取输入三种的方式分享

2022-10-20,,,,

在java 字符终端获取输入三种方式:

1、java.lang.system.in (目前jdk版本均支持)
2、java.util.scanner (jdk版本>=1.5)
3、java.io.console(jdk版本>=1.6),特色:能不回显密码字符

参考:
这里记录java中从控制台读入信息的几种方式
(1)jdk 1.4(jdk 1.5和jdk 1.6也都兼容这种方法)

复制代码 代码如下:
public class testconsole1 { 
    public static void main(string[] args) { 
        string str = readdatafromconsole("please input string:); 
        system.out.println("the information from console: + str); 
    } 

    /**
     * use inputstreamreader and system.in to read data from console
     * 
     * @param prompt
     *            
     * @return input string
     */ 
    private static string readdatafromconsole(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; 
    } 

(2)jdk 1.5(利用scanner进行读取)
复制代码 代码如下:
public class testconsole2 { 
    public static void main(string[] args) { 
        string str = readdatafromconsole("please input string:"); 
        system.out.println("the information from console:" + str); 
    } 

    /**
     * use  java.util.scanner to read data from console
     * 
     * @param prompt
     * 
     * @return input string
     */ 
    private static string readdatafromconsole(string prompt) { 
        scanner scanner = new scanner(system.in); 
        system.out.print(prompt); 
        return scanner.nextline(); 
    } 

scanner还可以很方便的扫描文件,读取里面的信息并转换成你要的类型,比如对“2 2.2 3.3 3.33 4.5 done”这样的数据求和,见如下代码:
复制代码 代码如下:
public class testconsole4 { 

    public static void main(string[] args) throws ioexception { 
        filewriter fw = new filewriter("num.txt"); 
        fw.write("2 2.2 3.3 3.33 4.5 done"); 
        fw.close(); 

        system.out.println("sum is "+scanfileforsum("num.txt")); 
    } 

    public static double scanfileforsum(string filename) throws ioexception { 
        double sum = 0.0; 
        filereader fr = null; 
        try { 
            fr = new filereader(filename); 
            scanner scanner = new scanner(fr); 

            while (scanner.hasnext()) { 
                if (scanner.hasnextdouble()) { 
                    sum = sum + scanner.nextdouble(); 

                } else { 
                    string str = scanner.next(); 

                    if (str.equals("done")) { 
                        break; 
                    } else { 
                        throw new runtimeexception("file format is wrong!"); 
                    } 

                } 
            } 

        } catch (filenotfoundexception e) { 
            throw new runtimeexception("file " + filename + " not found!"); 
        } finally { 
            if (fr != null) 
                fr.close(); 
        } 
        return sum; 
    } 

(3)jdk 1.6(利用java.io.console进行读取)
jdk6中提供了java.io.console类专用来访问基于字符的控制台设备.
你的程序如果要与windows下的cmd或者linux下的terminal交互,就可以用console类代劳.(类似system.in和system.out)
但我们不总是能得到可用的console, 一个jvm是否有可用的console依赖于底层平台和jvm如何被调用.
如果jvm是在交互式命令行(比如windows的cmd)中启动的,并且输入输出没有重定向到另外的地方,那么就可以得到一个可用的console实例。
在使用 ide 的情况下,是无法获取到console实例的,原因在于在 ide 的环境下,重新定向了标准输入和输出流,也是就是将系统控制台上的输入输出重定向到了 ide 的控制台中
复制代码 代码如下:
public class testconsole3 { 
    public static void main(string[] args) { 
        string str = readdatafromconsole("please input string:"); 
        system.out.println("the information from console:" + str); 
    } 

    /**
     * use  java.io.console to read data from console
     * 
     * @param prompt
     * 
     * @return input string
     */ 
    private static string readdatafromconsole(string prompt) { 
        console console = system.console(); 
        if (console == null) { 
            throw new illegalstateexception("console is not available!"); 
        } 
        return console.readline(prompt); 
    } 

console类还有个特色就是,专门对密码(输入无回显)等安全字符,进行了处理。专门提供 readpassword()方法,具体应用见如下代码:
复制代码 代码如下:
public class testconsole5 { 

     public static void main(string[] args) { 
            console console = system.console(); 
            if (console == null) { 
                throw new illegalstateexception("console is not available!"); 
            } 

            while(true){ 
            string username = console.readline("username: "); 
            char[] password = console.readpassword("password: "); 

            if (username.equals("chris") && string.valueof(password).equals("gohead")) { 
              console.printf("welcome to java application %1$s.\n", username); 
             // 使用后应立即将数组清空,以减少其在内存中占用的时间,增强安全性  
                password = null; 
              system.exit(-1); 
            }  
            else { 
              console.printf("invalid username or password.\n"); 
            } 
            } 
          } 

《Java 字符终端上获取输入三种的方式分享.doc》

下载本文的Word格式文档,以方便收藏与打印。