Scanner读取文件和输入数据(六)

简介: Scanner读取文件和输入数据(六)

一. 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 类时,就非常方便了。


一.一 构造方法


一.一.一 方法


image.png


一般用的是 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 的方法有很多,只列举几个常用的。


image.png


二. 演示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


20200617182349897.png


会自动转换成相应的int 类型。


如果你输入的不是 数字型字符串,那么将会转换失败, 抛出 java.util.InputMismatchException 类型。


20200617182356288.png


所以,通常在接收之前,会验证传入数据的合法性。


二.二 接收前验证数据


用 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();
}


当输入非数字时,


20200617182401756.png


二.三 重复接收不同类型的数据


    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();
    }


20200617182407183.png


可以用 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() 进行接收时,


20200617182415500.png


发现,只会读取空格前面的 我是。

当用 nextLine() 进行接收时,


20200617182420573.png


两者的结束标识是不一样的, 这个标识是可以自动设置的。 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();
    }


这个时候,再输入空格时, 就不会结束了。


20200617182426240.png


二.五 读取文件的内容


读取时,按行读取,需要判断是否还有下一行, 如果有,就读取。


传入参数,最好传入输入流, 统一。


   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();
    }


运行程序:


20200617182431125.png


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

相关文章
|
6月前
|
C++
C++学习系列---读取文件名存入txt和从txt读取每行信息
C++学习系列---读取文件名存入txt和从txt读取每行信息
|
6月前
|
存储 C语言
C 语言文件读取全指南:打开、读取、逐行输出
要从文件读取,可以使用 r 模式: FILE *fptr; // 以读取模式打开文件 fptr = fopen("filename.txt", "r"); 这将使 filename.txt 打开以进行读取。 在 C 中读取文件需要一点工作。坚持住!我们将一步一步地指导您。 接下来,我们需要创建一个足够大的字符串来存储文件的内容。 例如,让我们创建一个可以存储多达 100 个字符的字符串:
581 2
C 语言文件读取全指南:打开、读取、逐行输出
|
4月前
输出到一个新文件C中
【7月更文挑战第9天】输出到一个新文件C中。
48 13
|
存储 安全 C语言
C++输入和输出流1
C++输入和输出流1
46 0
|
Java
Java IO流--标准输入System.in,输出流System.out的使用
Java IO流--标准输入System.in,输出流System.out的使用
190 0
|
Java
Java Scanner(cmd数据输入)
Java Scanner(cmd数据输入)
67 0
Scanner中nextLine()在nextInt()的几种解决方式
Scanner中nextLine()在nextInt()的几种解决方式
87 0
|
Java Android开发
【暴躁版】Java如何用IO流读取一个文本,按行输出到控制台?
【暴躁版】Java如何用IO流读取一个文本,按行输出到控制台?
170 0
|
人工智能 C#
C# 控制台输入输出
C# 中有五种常用的输入输出方法,Console.ReadLine(),Console.ReadKey(),Console.Read(),Console.WriteLine(),Console.Write()
410 0
C# 控制台输入输出
编写一个程序,如果名为Exercise12_15.txt的文件不存在,则创建该文件。使用文本I/O将随机产生的100个整数写入文件,文件中的整数由空格分开。从文件中读回数据并以升序显示数据。
编写一个程序,如果名为Exercise12_15.txt的文件不存在,则创建该文件。使用文本I/O将随机产生的100个整数写入文件,文件中的整数由空格分开。从文件中读回数据并以升序显示数据。
279 0