Java Scanner用法详解

Java Scanner用法详解Scanner用法及Scanner报错:java.util.NoSuchElementException。

大家好,又见面了,我是你们的朋友全栈君。

本文转载自:

      java中的Scanner

      百度经验:Java中Scanner类的用法

      Java Scanner类报错java.util.NoSuchElementException

一、Scanner类简介

      Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序。它是以前的StringTokenizer和Matcher类之间的某种结合。由于任何数据都必须通过同一模式的捕获组检索或通过使用一个索引来检索文本的各个部分。于是可以结合使用正则表达式和从输入流中检索特定类型数据项的方法。这样,除了能使用正则表达式之外,Scanner类还可以任意地对字符串和基本类型(如int和double)的数据进行分析。借助于Scanner,可以针对任何要处理的文本内容编写自定义的语法分析器。

二、Scanner类用法

      Scanner是SDK1.5新增的一个类,可使用该类创建一个对象。

      Scanner reader=new Scanner(System.in); 

      然后reader对象调用下列方法(函数),读取用户在命令行输入的各种数据类型  

      next.Byte(),nextDouble(),nextFloat,nextInt(),nextLine(),nextLong(),nextShot() 

     上述方法执行时都会造成堵塞,等待用户在命令行输入数据回车确认.例如,拥护在键盘输入12.34,hasNextFloat()的值是true,而hasNextInt()的值是false。NextLine()等待用户输入一个文本行并且回车,该方法得到一个String类型的数据。

      Scanner的构造器支持多种方式,可以从字符串(Readable)、输入流、文件等等来直接构建Scanner对象,有了Scanner了,就可以逐段(根据正则分隔式)来扫描整个文本,并对扫描后的结果做想要的处理。

      下面是一些API函数的用法:

      delimiter() :返回此 Scanner 当前正在用于匹配分隔符的 Pattern。
      hasNext() :判断扫描器中当前扫描位置后是否还存在下一段。(原APIDoc的注释很扯淡)
      hasNextLine() :如果在此扫描器的输入中存在另一行,则返回 true。
      next() :查找并返回来自此扫描器的下一个完整标记。
      nextLine() :此扫描器执行当前行,并返回跳过的输入信息。

三、Scanner类实例

(1)

import java.util.*;
public class Example
{
public static void main(String args[])
{
System.out.println("请输入若干个数,每输入一个数用回车确认");
System.out.println("最后输入一个非数字结束输入操作");
Scanner reader=new Scanner(System.in);
double sum=0;
int m=0;
while(reader.hasNextDouble())
{
    double x=reader.nextDouble();
    m=m+1;
    sum=sum+x;
}
System.out.printf("%d个数的和为%f\n",m,sum);
System.out.printf("%d个数的平均值是%f\n",m,sum/m);
}
}

      运行结果:

      C:\java>java     

      请输入若干个数,每输入一个数用回车确认

      最后输入一个非数字结束输入操作

      34.13445

      3个数的和为113.100000

      3个数的平均值是37.700000

(2)读取并分析文本文件:hrinfo.txt

import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
public class readhuman {
private static void readfile(String filename) {
try {
   Scanner scanner = new Scanner(new File(filename));
   scanner.useDelimiter(System.getProperty("line.separator"));
   while (scanner.hasNext()) {
      parseline(scanner.next());
   }
   scanner.close();
}catch (FileNotFoundException e) {
   System.out.println(e);
}
}
private static void parseline(String line) {
    Scanner linescanner = new Scanner(line);
    linescanner.www.gzlij.com useDelimiter(",");
    //可以修改usedelimiter参数以读取不同分隔符分隔的内容
    String name = linescanner.next();
    int age = linescanner.nextInt();
    String idate = linescanner.next();
    boolean iscertified = linescanner.nextBoolean();
    System.out.println("姓名:"+name+" ,年龄:"+ age+" ,入司时间:"+ idate+" ,验证标记:"+iscertified );
}
public static void main(String[] args) {
    if (args.length != 1) {
   System.err.println("usage: java readhuman file location");
   System.exit(0);
    }
   readfile(args[0]);
}
}

      运行结果:C:\java>java     readhuman hrinfo.txt

      姓名:老赵 ,年龄:28 ,入司时间:feb-01 ,验证标记:true

      姓名:小竹 ,年龄:22 ,入司时间:dec-03 ,验证标记:false

      姓名:阿波 ,年龄:21 ,入司时间:dec-03 ,验证标记:false

      姓名:凯子,年龄:25 ,入司时间:dec-03 ,验证标记:true

(3)Scanner默认使用空格作为分割符来分隔文本,但允许你指定新的分隔符

      使用默认的空格分隔符:

        public static void main(String[] args) throws FileNotFoundException { 
                Scanner s = new Scanner("123 asdf sd 45 789 sdf asdfl,sdf.sdfl,asdf    ......asdfkl    las"); 
//                s.useDelimiter(" |,|\\."); 
                while (s.hasNext()) { 
                        System.out.println(s.next()); 
                } 
        }

      运行结果:

      123 
      asdf 
      sd 
      45 
      789 
      sdf 
      asdfl,sdf.sdfl,asdf 
      ……asdfkl 
      las 

      –将注释行去掉,使用空格或逗号或点号作为分隔符,输出结果如下:
      123 
      asdf 
      sd 
      45 
      789 
      sdf 
      asdfl 
      sdf 
      sdfl 
      asdf 

      asdfkl 

      las 

四、Scanner报错:java.util.NoSuchElementException

【问题描述】代码如下:

String str1 = input1.nextLine();
      input1.close();
      Scanner input2 = new Scanner(System.in);
      String str2 = input2.nextLine();
      input2.close();

【报错原因】在第二次使用Scanner之前调用了close方法。而在关闭的时候,会把System.in也关闭了。当下次new一个读取的时候,因为输入流已经关闭,所以读取的值就是-1;在Scanner 的readinput方法里面有以下代码。

try {
            n = source.read(buf);
        } catch (IOException ioe) {
            lastException = ioe;
            n = -1;
        }
 
        if (n == -1) {
            sourceClosed = true;
            needInput = false;
        }

      因为读到了-1就设置sourceClosed =true;neepinput=false; 在next方法里面有以下代码:

 

 

if (needInput)
                readInput();
            else
                throwFor();

      当needinput为false,就执行throwFor,因此再看throwFor

skipped = false;
        if ((sourceClosed) && (position == buf.limit()))
            throw new NoSuchElementException();
        else
            throw new InputMismatchException();

      position 是当前读取的内容在缓冲区中位置,因为读取的是-1,因此position =0,而buf.limit()也等于0,因此就执行了throw new NoSuchElementException();

      【解决方案】将input1.close()放在input2.close()之上即可。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156762.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • jupyter跟python的关系_jupyter python

    jupyter跟python的关系_jupyter python大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。jupyter和pycharm区别如下:1、Python是一种广泛使用的高级的、通用的、解释的、动态编程语言。”Python是一种相当古老且流行的语言,它是开源的,常被应用于网站开发(利用Django、Flask等框架)、科学统计计算(NumPy、SciPy等库可以帮助计算)、软件开发等甚至更多。Jupyter项目开…

    2022年8月28日
    3
  • 大数据分析就业和发展前景_大数据将来的就业方向

    大数据分析就业和发展前景_大数据将来的就业方向一篇文章看懂大数据分析就业前景及职能定位

    2022年4月21日
    42
  • java手机号正则表达式验证,面试必会「建议收藏」

    java手机号正则表达式验证,面试必会「建议收藏」什么是Arthas?Arthas是一款开源在线诊断工具,采用命令行交互模式,支持web端在线诊断,同时提供丰富的Tab自动补全功能,进一步方便进行问题的定位和诊断。这是一款开源一年多GitHubstar2万,99%的阿里研发小哥都在用的Java终极诊断利器!相对比直接下载使用,我推荐开发者可以试一下通过IDE插件CloudToolkit中使用Arthas来实现一键远程诊断功能。得益于Arthas强大且丰富的功能,让Arthas能做的事情超乎想象。下面仅仅列举几

    2022年9月17日
    4
  • L330 Black hole picture captured for first time in space ‘breakthrough’

    L330 Black hole picture captured for first time in space ‘breakthrough’

    2021年7月4日
    76
  • C++ byte数组/char数组 截取部分字节

    C++ byte数组/char数组 截取部分字节VS-C++系列:所有相关C++文章链接.VS-C#系列:所有相关C#文章链接.bat系列:所有相关bat文章链接.Keil系列:所有相关文章链接所有内容均以最小系统调试成功;逐步提供低分源码工程下载!保证每行代码都经过验证!如有疑惑,欢迎留言,看见即回;祝好__byDxg_LC序言:1、以上链接为方便整理查看资料用;伴随博文发布更新,如果有不正确处,感谢指正2、因本人能力有限若有不正确之处或者相关超链接失效,请于相关文章内提醒@博主;灰常感谢3、友情提醒1,勿要《一支烟

    2022年5月22日
    123
  • centos安装教程详解_ensp详细安装步骤

    centos安装教程详解_ensp详细安装步骤Linux中三大主流操作系统Ubuntu优点:用户界面友好、工具完善缺点:vps(虚拟服务器)成本较高、不具备商业化服务器操作系统Centos–目前常用centos6.x,centos7.x

    2022年8月6日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号