方法1:Scanner类
Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序。它是以前的StringTokenizer和Matcher类之间的某种结合。由于任何数据都必须通过同一模式的捕获组检索或通过使用一个索引来检索文本的各个部分。于是可以结合使用正则表达式和从输入流中检索特定类型数据项的方法。这样,除了能使用正则表达式之外,Scanner类还可以任意地对字符串和基本类型(如int和double)的数据进行分析。借助于Scanner,可以针对任何要处理的文本内容编写自定义的语法分析器。
类加载
import java.util.Scanner;
用给定的输入流创建一个Scanner对象:
Scanner in = new Scanner(InputStream in);
Scanner类的构造器
可以从字符串(Readable)、输入流、文件等等来直接构建Scanner对象,有了Scanner了,就可以逐段(根据正则分隔式)来扫描整个文本,并对扫描后的结果做想要的处理。
Scanner类中的方法
Scanner in = new Scanner(System.in);
//检测输入中是否还有其他单词
boolean bn = in.hasNext();
boolean bnl = in.hasNextLine();
boolean bni = in.hasNextInt();
boolean bnd = in.hasNextDouble();
//输入一行(包含空格)
String str = in.nextLine();
//读取一个单词(以空白符作为分隔符),只读空格之前的数据,并且cursor指向本行
//从遇见的第一个有效字符(非空格,非换行符)开始扫描,
//当遇见第一个分隔符或结束符(空格或换行符)时,结束扫描,获取扫描到的内容,即获得第一个扫描到的不含空格、换行符的单个字符串。
String firstName = in.next();
//读取一个整数,只读取数值,剩下”\n”还没有读取,并将cursor放在本行中
int age = in.nextInt();
//读取一个浮点数
double num = in.nextDouble()
上述方法执行时都会造成堵塞,等待用户在命令行输入回车确认
Scanner类读取控制台输入
public static void main(String[] args) {
String s1,s2; Scanner sc=new Scanner(System.in);
System.out.print("请输入第一个字符串:");
s1=sc.nextLine();
System.out.print("请输入第二个字符串:");
s2=sc.next();
System.out.println("输入的字符串是:"+s1+" "+s2);
sc.close();
}
运行结果:
请输入第一个字符串:home
请输入第二个字符串:work
输入的字符串是:home work
把上面的程序修改一下:
s1=sc.next();
s2=sc.nextLine();
运行结果:
请输入第一个字符串:home
请输入第二个字符串:输入的字符串是:home
解释:nextLine()自动读取了被next()去掉的Enter作为他的结束符,所以没办法给s2从键盘输入值。
Scanner类结束输入的方法:在控制台下输入ctrl+Z
Scanner类输入是可见的,不适合从控制台读取密码,Java 6引入Console实现读取
Scanner类读取文件
将文件中的内容一行一行的读入
*文档在项目中(如图)
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class TestScannerRead {
public static void main(String[] args){
Scanner sc;
try {
//读取项目中的文档
sc = new Scanner(new File("ScannerTest.txt"));
//通过判断是否有下一行来输出文档内容
while (sc.hasNextLine()) {
System.out.println(sc.nextLine());
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
* 文档在本地
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class TestScannerRead {
public static void main(String[] args){
FileInputStream fis;
try {
//利用文件上传功能
fis = new FileInputStream("D:\\happy.txt");
//设置文件编码
Scanner sc = new Scanner(fis,"UTF-8");
//输出文件内容
while (sc.hasNextLine()) {
System.out.println(sc.nextLine());
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
方法2:Console类中的方法
类加载
import java.io.Console;
如果有可能进行交互操作,就通过控制台窗口为交互的用户返回一个Console对象。否则返回null。对于任何一个通过控制台窗口启动的程序,都可以使用Console对象。否则,其可用性将与使用的系统有关。
*注:java.io.Console 只能用在标准输入、输出流未被重定向的原始控制台中使用,在 Eclipse 或者其他 IDE 的控制台是用不了的。
Console cons = System.console()
static char[] readPassword(String prompt,Object…args)
static String readLine(String prompt,Object…args)
为了安全起见,返回的密码存放在一维字符数组中,而不是字符串中。在对密码进行处理之后,应马上用一个填充值覆盖数组元素。
采用console输入一次只能读取一行。
编译:
javac TestConsole.java
java TestConsole
Console console=System.console();
if(console!=null)
{
System.out.println("input data");
String data=console.readLine();
System.out.println("data="+data);
char[] pwds=console.readPassword();
System.out.println("pwds="+pwds);
data=console.readLine("hello %s", "test");
System.out.println(data);
pwds=console.readPassword("hello password %s", "test");
System.out.println(pwds);
//输出
console.writer().println("finish");
console.flush();
}else{
System.out.println("console==null");
}
方法3:System.in类
类加载
import java.io.*;
从输入流中读取一个字节(所输入字符的ASCII码),然后再将ASCII码转换为Unicode码,返回值为Unicode编码的int整型值。按回车输入结束。
*缺点一: 该方法能获取从键盘输入的字符,但只能针对一个字符的获取
*缺点二: 获取的只是char类型的。如果想获得int,float等类型的输入,比较麻烦。
import java.io.IOException;
public class Test {
public static void main(String[] args) {
try{
System.out.print("Enter a Char:");
char i = (char)System.in.read();
System.out.println("Yout Enter Char is:" + i);
}
catch(IOException e){
e.printStackTrace();
}
}
}
方法4:InputStreamReader和BufferedReader方法
类加载
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
System.in是一个很原始、很简陋的输入流对象,通常不直接使用它来读取用户的输入。一般会在外面封装过滤流:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
然后调用br.readLine()方法进行读取。
*优点: 可以获取键盘输入的字符串
*缺点: 如何要获取的是int,float等类型的仍然需要转换
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class Test {
public static void main(String[] args) {
InputStreamReader is = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(is);
try{
String name = br.readLine();
System.out.println("ReadTest Output:" + name);
}
catch(IOException e){
e.printStackTrace();
}
}
}