很多关于上述几个方法的介绍都非常晦涩,很复杂,我们在处理相关问题时只需要记住以下规律即可:
(1)Scanner是一个扫描器,对于键盘输入或者文件中的数据,先存到缓存区等待读取,它判断读取结束的标示是:空格,回车,tab 等;
(2)next()和nextInt()方法读取到任意间隔符(如空格和回车)就结束,nextLine()读取到回车结束也就是“\r”,next()返回值为String类型,nextLine()返回值为String类型,nextInt()返回值为Int类型。
读取结束后光标(这里理解为读取起点)会移到当前结束位置后,如果接着读上一次输入的内容或者连续读取文件,会从光标的最新位置开始读
返回值为String类型的好处就是不管输入的是字符串还是数字,都会判断为字符串,并正确输出。
目录
1.从键盘输入读取数据时
通过System.in获取键盘输入数据时,scanner = new Scanner(System.in)语句出现一行就输入一次,按回车(换行键结束输入当次输入),所以每次输入值的最后一个字符是回车符。
输入的内容取决于紧跟该语句的方法类型,分情况如下:
(1)如果紧跟的是nextInt()语句,则输入内容开头必须以“整数”或者“空格 整数”的形式,如:
import java.util.Scanner;
public class MyDemo {
public static void main(String[] args) throws FileNotFoundException {
Scanner scanner = new Scanner(System.in);//出现一行就输入一次,按回车(换行键结束输入)
int m=scanner.nextInt();//由于紧跟输入语句的是nextInt()方法,所以上面输入的内容的开头必须是整数,或为空格+整数
System.out.println("键盘输入以整数开头,输出的是"+m);//打印结果
scanner = new Scanner(System.in);
int n=scanner.nextInt();
System.out.println("键盘输入空格 整数开头,输出的是"+n);//打印结果
}
}
输出结果为:
(2)如果紧跟的是nextLine()语句,则键盘输入的内容随意,语句会获取输入的全部内容,因为方法的读取结束符为回车,回车键是当前内容输入结束时必须要按的(记住nextLine()语句返回值是String类型),程序如下:
import java.io.FileNotFoundException;
import java.util.Scanner;
public class MyDemo {
public static void main(String[] args) throws FileNotFoundException {
Scanner scanner = new Scanner(System.in);//出现一行就输入一次,按回车(换行键结束输入)
String m=scanner.nextLine();//由于紧跟输入语句的是nextLine()方法,所以上面输入的内容随意,语句会获取输入的全部内容
System.out.println("键盘输入以整数开头,输出的是"+m);//打印结果
scanner = new Scanner(System.in);
String n=scanner.nextLine();
System.out.println("键盘输入以字符开头,输出的是"+n);//打印结果
}
}
输出结果为:
(3)如果紧跟的是next()语句,则键盘输入的内容也随意,但语句只读到输入内容的第一个间隔符位置(记住next()语句返回值也是String类型)
import java.io.FileNotFoundException;
import java.util.Scanner;
public class MyDemo {
public static void main(String[] args) throws FileNotFoundException {
Scanner scanner = new Scanner(System.in);//出现一行就输入一次,按回车(换行键结束输入)
String m=scanner.next();//由于紧跟输入语句的是nextLine()方法,所以上面输入的内容随意,语句读到输入内容中的第一个间隔符为止
System.out.println("键盘输入以整数开头,输出的是"+m);//打印结果
scanner = new Scanner(System.in);
String n=scanner.next();
System.out.println("键盘输入以字符开头,输出的是"+n);//打印结果
scanner = new Scanner(System.in);
String k=scanner.next();
System.out.println("键盘输入以空格开头,输出的是"+k);//打印结果
}
}
输出结果为:
所以不管是 next()还是nextInt()语句,对于键盘输入内容的开头为空格时,都不会将空格作为分隔符,而是会读取空格后第一个符合所需类型的元素。但是nextLine()语句会将输入对象开头第一个空格也读取。
(4)当连续读取键盘的输入内容时
import java.util.Scanner;
public class MyDemos {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);//输入
String m=scanner.next();
System.out.println("读取第一个字符串,到空格结束,光标移到空格处,输出的是"+m);
int n=scanner.nextInt();
System.out.println("读取上次结束位置后的第一个整数,光标移到整数后空格处,输出的是"+n);
String k=scanner.nextLine();
System.out.println("从上次光标的最后位置读到换行符处,输出的是"+k);
}
}
输出结果:
2.从txt文件中读取数据时
位于项目文件夹的/res/MyDemo.txt文件中保存着以下数据:
运行以下程序:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class MyDemo {
public static void main(String[] args) throws FileNotFoundException {
String path = "res/";
String filename = "MyDemo.txt";
Scanner scanner = new Scanner(new File(path + filename));
String str=scanner.nextLine();
System.out.println("str:"+str);
int m=scanner.nextInt();
System.out.println("m:"+m);
String str2=scanner.nextLine();
System.out.println("str2:"+str2);
String str3=scanner.next();
System.out.println("str3:"+str3);
int p=scanner.nextInt();
System.out.println("p:"+p);
}
}
得到如下结果:
本例是对同一个文件内容的连续读取,所以需要判断光标(上一次读取结束的位置)的位置
nextLine()读取到回车结束,而文件中第一行6后面才有换行符,所以读到6结束,光标来到下一行
而next()和nextInt()方法读取到任意间隔符(如空格和回车)就结束,第二行中1后面就有空格符,所以m读到1就结束,光标移到1之后(-3之前),依此类推。