0 引言
从控制台中读取数据是一个比较常用的功能,在 JDK 5.0 以前的版本中的实现是比较复杂的,需要手工处理系统的输入流。有意思的是,从 JDK 5.0 版本开始,能从控制台中输入数据的方法每增加一个版本号,就有一种新增的方法,这也增加了选择的种类,可以依据不同的要求来进行选择。下面来看一下,各个版本中如何从控制台中读取数据以及各自的优缺点。
1 JDK 1.4 及以下版本读取的方法
JDK 1.4 及以下的版本中要想从控制台中输入数据只有一种办法,即使用System.in获得系统的输入流,再桥接至字符流从字符流中读入数据。示例代码如下:
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);
}
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 及以下版本中从控制台读取数据唯一的办法。还有一种非控制台读入数据的办法,就是采用 Swing 中的JOptionPane,会弹出一个非常漂亮的输入对话框让使用者输入数据,但这是一种比较另类的做法,不推荐使用。
import javax.swing.JOptionPane;
public class Test2 {
public static void main(String[] args) {
String str = readStringFromDialog("请输入字符串:");
System.out.println("readStringFromDialog 方法的输入:" + str);
}
private static String readStringFromDialog(String prompt) {
return JOptionPane.showInputDialog(prompt);
}
}
上面的两种方法都有个共同的缺点——只能读取字符串,若需要读取其他类型的数据需要手工进行转换。
2 JDK 5.0 读取的方法
从 JDK 5.0 开始,基本类库中增加了java.util.Scanner类,根据它的 API 文档说明,这个类是采用正则表达式进行基本类型和字符串分析的文本扫描器。使用它的Scanner(InputStream source)构造方法,可以传入系统的输入流System.in而从控制台中读取数据。示例代码如下:
import java.util.Scanner;
public class Test3 {
public static void main(String[] args) {
String str = readString5("请输入字符串:");
System.out.println("readString5 方法的输入:" + str);
}
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 文档说明。
3 JDK 6.0 读取的方法
从 JDK 6.0 开始,基本类库中增加了java.io.Console类,用于获得与当前 Java 虚拟机关联的基于字符的控制台设备。在纯字符的控制台界面下,可以更加方便地读取数据。示例代码如下:
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);
}
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类,可以在方法参数中直接放入提示信息。
如果需要在控制台中输入密码等敏感信息的话,像在浏览器或者是应用程序中那样显示替代字符,在 JDK 6.0 以前的做法是相当麻烦的(具体的做法可以参考《Java 编程语言中的口令屏蔽》一文),而使用Console类的readPassword()方法可以在控制台上不回显地输入密码,并将密码结果保存在char数组中,根据 API 文档的建议,在使用后应立即将数组清空,以减少其在内存中占用的时间,以便增强安全性。
但是,Console也有一些缺点,根据ConsoleAPI 文档的说明:
虚拟机是否具有控制台取决于底层平台,还取决于调用虚拟机的方式。如果虚拟机从一个交互式命令行开始启动,且没有重定向标准输入和输出流,那么其控制台将存在,并且通常连接到键盘并从虚拟机启动的地方显示。如果虚拟机是自动启动的(例如,由后台作业调度程序启动),那么它通常没有控制台。
通过上面的文档说明可以看出,在使用 IDE 的情况下,是无法获取到Console实例的,原因在于在 IDE 的环境下,重新定向了标准输入和输出流,也是就是将系统控制台上的输入输出重定向到了 IDE 的控制台中。因此,在 IDE 中不能使用这个程序,而Test1和Test3就没有这种限制。
4 总结
以上囊括了 Java 中各种版本从控制台中读入数据的方法,将对它们的优缺点进行了分析。下面给出了一些使用建议,可供参考:
JRE 1.4 或以下版本的情况下,没得选择只能采用Test1或者是非控制台读入的Test2的方法。
JRE 5.0 的情况下,建议使用基于Scanner的Test3的方法,更方便地进行数据读取。
JRE 6.0 的情况,并且只在字符界面的控制台下运行时,采用Test4的方法,如果需要读入像密码之类的敏感数据,为了安全性考虑也必须使用Test4或者是自行实现。如果需要读入除字符串类型之外的其他数据类型,建议使用基于Scanner的控制台输入。
相关推荐
java 控制台输入密码显示星号 通过JNI 来调用 c++中方法 java 控制台输入密码显示星号 通过JNI 来调用 c++中方法 java 控制台输入密码显示星号 通过JNI 来调用 c++中方法 java 控制台输入密码显示星号 通过JNI 来...
1. **Java控制台输入**: 在Java中,我们通常使用`System.in`对象来获取控制台输入。通过`Scanner`类,我们可以方便地读取用户从键盘输入的数据。例如: ```java Scanner scanner = new Scanner(System.in); ...
在Java编程语言中,从命令控制台输入数据是与用户交互的基本需求之一,尤其是在命令行应用、游戏开发或脚本编写等场景下尤为重要。本文将详细介绍几种常用的在Java中从命令控制台输入数据的方法,包括直接使用`...
实现了简单的控制台输入功能比较简单 喜欢的自己下载吧 方法摘要: 方法摘要 static java.lang.String inputStr() static double moreZeroDouble() static int moreZeroInt() static double ...
java控制台程序 1)控制台输入指令1,添加数据到数组 2)控制台输入指令2,随机生成一个输入数据 3)控制台输入指令3,退出程序 使用到的类 java.util.ArrayList java.util.List java.util.Random java.util.Scanner
Java控制台输入数组并逆序输出的方法实例 Java控制台输入数组并逆序输出的方法实例主要介绍了Java手动输入数组并逆向输出的方法实例。下面是对这个知识点的详细说明: 一、 Java控制台输入 Java控制台输入是指...
在Java编程中,有时我们需要与操作系统进行交互,执行系统级别的命令,例如在控制台执行CMD命令或者通过SSH连接远程Linux服务器执行shell命令。这在自动化脚本、系统管理或者远程监控等场景中非常常见。本篇文章将...
在Java编程语言中,控制台输入是程序与用户交互的基础,尤其在开发命令行应用程序时。本篇笔记主要探讨了如何在Java中实现控制台输入各种类型的数据,并提供了两种检查字符串中是否包含数字的方法。 首先,Java通过...
"java控制台输入示例分享" Java控制台输入示例分享主要介绍了Java控制台输入示例分享,需要的朋友可以参考下。下面将详细介绍Java控制台输入示例分享的知识点。 一、JDK 1.4 及以下版本读取的方法 在JDK 1.4 及...
### Java控制台接收源代码详解 #### 一、引言 在Java开发中,通过控制台接收用户输入是非常常见的操作之一。例如,在命令行界面环境下,我们常常需要从用户那里获取一些必要的信息来完成特定的功能或者计算。本文...
自己做的小东西,可能有未完善的地方;有错请喷!Java 获取控制台输入的整数并输出最大值和最小值。
Java控制台应用的核心在于输入和输出的处理。`System.in`代表标准输入流,可以与`BufferedReader`或`Scanner`等类结合使用,读取用户的键盘输入。以下是一个使用`Scanner`读取用户输入的例子: ```java import java...
在Java编程中,控制台输入输出是开发人员与用户交互的基础。通过控制台,我们可以接收用户的输入并展示程序的运行结果。本主题将深入探讨Java中的...通过实践这些代码,你可以更好地理解Java控制台输入输出的工作原理。
### JAVA数据输入方式详解 #### 一、命令行输入 命令行输入是一种基本的数据输入方式,在Java中可以通过主函数中的`args`数组来接收。这种方式适用于简单的数据输入场景,但其灵活性较差,不适合复杂的交互式操作...
在Java编程语言中,开发一个控制台输入的用户管理系统是一项基础但重要的实践任务。这个系统主要目的是通过控制台交互,允许用户进行登录并执行各种管理操作。以下是对这个项目涉及的关键知识点的详细解释: 1. **...
6. **控制台输入**: - `Scanner`类:Java提供的标准输入流工具,可以读取用户的键盘输入。在本例中,我们需要使用`Scanner.nextInt()`来获取用户输入的年份和月份。 通过完成这个项目,新手不仅能熟悉Java的基本...
处理各种情况的用户输入,并且能按照程序员对的需求,得到用户的控制台输入: 1、读取键盘输入的一个菜单项,值:1-5范围 2、读取键盘输入的一个字符 3、读取键盘输入的一个字符,如果直接回车,则返回指定的默认值(可修改...
2. **控制台输入输出**: - **Scanner类**:用于从控制台获取用户输入,比如客户ID、商品ID等。 - **System.out.println()**:用于在控制台上打印信息,展示商品列表、购物车详情等。 3. **文件I/O操作**: - ...
总的来说,`java控制台版笔记本`项目是一个很好的学习实践,它涵盖了Java语言的核心概念,包括面向对象编程、输入输出处理、数据结构的运用以及异常处理。通过参与这样的项目,开发者可以加深对Java的理解,并锻炼...
在IT领域,尤其是在软件开发中,商品管理是一个常见的业务场景,尤其...此外,熟悉控制台输入输出操作,有助于锻炼解决问题和调试代码的能力。这个项目就是一个很好的实战练习,能够提升你的编程技能并积累实践经验。