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
也有一些缺点,根据Console
API 文档的说明:
虚拟机是否具有控制台取决于底层平台,还取决于调用虚拟机的方式。如果虚拟机从一个交互式命令行开始启动,且没有重定向标准输入和输出流,那么其控制台将存在,并且通常连接到键盘并从虚拟机启动的地方显示。如果虚拟机是自动启动的(例如,由后台作业调度程序启动),那么它通常没有控制台。
通过上面的文档说明可以看出,在使用 IDE 的情况下,是无法获取到Console
实例的,原因在于在 IDE 的环境下,重新定向了标准输入和输出流,也是就是将系统控制台上的输入输出重定向到了 IDE 的控制台中。因此,在 IDE 中不能使用这个程序,而Test1
和Test3
就没有这种限制。
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