一. Scanner 类
java.util.Scanner 类是 jdk1.5 之后出现的, 主要是方便读取 控制台输入的数据。当然,也可以读取文件的内容,但常用于接收控制台输入。
以前,我们要想接收控制台的输入信息,需要用到 System.in 的纯 InputStream情况。
如接收用户的年龄:
//注意,是字节读取,会存在乱码情况 public static void inTest() throws Exception{ System.out.println("请输入你的年龄:"); InputStream inputStream= System.in; byte[] bytes=new byte[6]; //将输入的内容放置到 bytes 字节数组里 int len=inputStream.read(bytes); String ageString=new String(bytes,0,len); int age=Integer.parseInt(ageString); System.out.println("用户的年龄是:"+age); }
单单的接收一个年龄,就需要很多步骤,如果接收多个信息,则需要循环实例化读取,当接收中文字符串的时候,还需要处理中文乱码的问题。
很麻烦, 但是使用 新的 Scanner 类时,就非常方便了。
一.一 构造方法
一.一.一 方法
一般用的是 InputStream 参数。
一.一.二 演示
@Test public void conTest() throws Exception{ //第一种方式,传入文件 File File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"out.txt"); Scanner scanner=new Scanner(file); //2. 第二种,传入 InputStream InputStream inputStream=new FileInputStream(file); Scanner scanner1=new Scanner(inputStream); //一般使用的是 System.in Scanner scanner2=new Scanner(System.in); //第三种, 还可以传入 Path Path path= Paths.get("E:","ideaWork"+ File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"Hello.txt"); Scanner scanner3=new Scanner(path); }
一.二 普通方法
Scanner 的方法有很多,只列举几个常用的。
二. 演示Scanner
二.一 读取单个数据 如 年龄
读取年龄时,用单纯的InputStream 时,会发现很难处理。 但是用 Scanner 时:
//接收前端传入的数据 public static void main(String[] args) { try { inputTest(); } catch (Exception e) { e.printStackTrace(); } } public static void inputTest() throws Exception{ Scanner scanner=new Scanner(System.in); //1. 输入name System.out.println("请输入年龄:"); //会自动转换 int age=scanner.nextInt(); System.out.println("您输入的年龄是:"+age); scanner.close(); }
运行程序,控制台输入年龄 24
会自动转换成相应的int 类型。
如果你输入的不是 数字型字符串,那么将会转换失败, 抛出 java.util.InputMismatchException 类型。
所以,通常在接收之前,会验证传入数据的合法性。
二.二 接收前验证数据
用 hasNextXxx() 进行验证。 当然,也可以自己写正则表达式进行验证
//main 方法中 调用 这个方法 public static void input1Test() throws Exception{ Scanner scanner=new Scanner(System.in); //1. 输入name System.out.println("请输入年龄:"); if(scanner.hasNextInt()){ int age=scanner.nextInt(); System.out.println("您输入的年龄是:"+age); }else{ System.out.println("请输入正确的年龄数字"); } scanner.close(); }
当输入非数字时,
二.三 重复接收不同类型的数据
public static void input2Test() throws Exception{ Scanner scanner=new Scanner(System.in); System.out.println("请输入年龄:"); //1. 接收 int int age=scanner.nextInt(); System.out.println("请输入成绩:"); //接收 float float score=scanner.nextFloat(); System.out.println("请输入姓名:"); //接收 字符串 String name=scanner.next(); System.out.println("姓名是:"+name+",年龄是:"+age+",成绩是:"+score); scanner.close(); }
可以用 next() 也可以用 nextLine() 进行接收字符串,不会造成中文乱码问题。 但是,这两者有什么区别呢?
next() 接收数据,是按照空格进行拆分的,每次读取时,读取到空格时会结束本次读取。
而 nextLine() 接收数据时,是按照回车键进行拆分的,每次读取时,读取到回车键时会结束本次读取。
二.四 next() 与 nextLine() 的区别
public static void input3Test() throws Exception{ Scanner scanner=new Scanner(System.in); System.out.println("请输入内容:"); String n1=scanner.next(); System.out.println("输出内容next接收:"+n1); /*String n2=scanner.nextLine(); System.out.println("输出内容 nextLine接收:"+n2);*/ scanner.close(); }
当用 next() 进行接收时,
发现,只会读取空格前面的 我是。
当用 nextLine() 进行接收时,
两者的结束标识是不一样的, 这个标识是可以自动设置的。 useDelimiter()
public static void input3Test() throws Exception{ Scanner scanner=new Scanner(System.in); System.out.println("请输入内容:"); scanner.useDelimiter("\n"); String n1=scanner.next(); System.out.println("输出内容next接收:"+n1); /* String n2=scanner.nextLine(); System.out.println("输出内容 nextLine接收:"+n2);*/ scanner.close(); }
这个时候,再输入空格时, 就不会结束了。
二.五 读取文件的内容
读取时,按行读取,需要判断是否还有下一行, 如果有,就读取。
传入参数,最好传入输入流, 统一。
public static void input4Test() throws Exception{ File file=new File("E:"+ File.separator+"ideaWork"+File.separator+"Java2"+File.separator+"fileSrc" +File.separator+"out.txt"); InputStream inputStream=new FileInputStream(file); Scanner scanner=new Scanner(inputStream); int i=0; //当还有数据时 while(scanner.hasNextLine()){ String line=scanner.nextLine(); System.out.println((++i)+":"+line); } scanner.close(); }
运行程序:
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!