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

勿以恶小而为之,勿以善小而不为--------------------------刘备

劝诸君,多行善事积福报,莫作恶

上一章简单介绍了 打印输出流PrintStream和PrintWriter(五),如果没有看过,请观看上一章

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

一.一 构造方法

一.一.一 方法

方法作用
Scanner​(File source, String charsetName)传入文件和 字符编码
Scanner​(InputStream source, String charsetName)传入InputStream 和 字符编码
Scanner​(Path source, String charsetName)传入Path 对象和字符编码

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

方法作用
void close​()关闭此扫描仪。
接收数据:
nextInt​()接收数据,并转换成int 类型
nextFloat​()接收数据,并转换成 Float类型
String next​()接收数据,并转换成字符串,接收数据时,空格结束
String nextLine​()接收数据,并转换成字符串, 接收数据时,回车键结束
–判断数据
boolean hasNextInt​()判断传入的数据,是否能转换成int类型
boolean hasNextFloat​()判断传入的数据,是否能转换成float 类型
boolean hasNext​()判断是否有下一个数据
boolean hasNextLine​()判断是否有下一行数据
boolean hasNext​(String pattern)判断是否符合 正则表达式
Scanner useDelimiter​(String pattern)设置结束读取的标识符

二. 演示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();
    }

运行程序:

有图片

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

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

两个蝴蝶飞

你的鼓励,是老蝴蝶更努力写作的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值