返回顶部
首页 > 资讯 > 后端开发 > Python >Java Scanner用法案例详解
  • 403
分享到

Java Scanner用法案例详解

2024-04-02 19:04:59 403人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

一、Scanner类简介       Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序。它是以前

一、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()之上即可。

到此这篇关于Java Scanner用法案例详解的文章就介绍到这了,更多相关Java Scanner用法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java Scanner用法案例详解

本文链接: https://lsjlt.com/news/134121.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java Scanner用法案例详解
    一、Scanner类简介       Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序。它是以前...
    99+
    2024-04-02
  • Java中Scanner用法实例解析
    目录一、Scanner类简介二、Scanner类的用法三、常用方法此处重点讲一下next()和nextLine()的区别总结一、Scanner类简介 Java 5添加了java.ut...
    99+
    2022-11-13
    java中Scanner用法 java scanner语句 java中的scanner类
  • Java ConcurrentHashMap用法案例详解
    一、概念 哈希算法(hash algorithm):是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值。 哈希表(hash table):根据设定的哈希函数H(k...
    99+
    2024-04-02
  • Java ArrayAdapter用法案例详解
          拖延症最可怕的地方就是:就算自己这边没有拖延,但对方也会拖延,进而导致自己这边也开始拖延起来!现在这个项目我这边已经是完...
    99+
    2024-04-02
  • Java SPI用法案例详解
     1.什么是SPI      SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接...
    99+
    2024-04-02
  • Java DatabaseMetaData用法案例详解
    目录一 . 得到这个对象的实例二. 方法getTables的用法三. 方法getColumns的用法四、方法getPrimaryKeys的用法五、方法.getTypeInfo()的用...
    99+
    2024-04-02
  • java中Scanner输入用法实例
    目录1.整数2.浮点数3.字符4.输入两个整数5.字符矩阵6.字符菱形7.字符转 ASCII 码8.实现四舍五入9.成绩输入输出10.学生基本信息输入输出11.按照格式输入并交换输出...
    99+
    2024-04-02
  • Java SpringBoot Validation用法案例详解
    目录constraints分类对象集成constraints示例SpringBoot集成自动验证集成maven依赖验证RequestBody、Form对象参数验证简单参数验证指定分组...
    99+
    2024-04-02
  • Java之Class.forName()用法案例详解
    Class.forName()主要功能 Class.forName(xxx.xx.xx)返回的是一个类, Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载...
    99+
    2024-04-02
  • Java中Scanner用法
    Java中Scanner用法 Scanner可以实现程序和人的交互,用户可以利用键盘进行输入。 不同类型的输入: String s=sc.next(); //接受字符串数据System.out.pr...
    99+
    2023-09-29
    java jvm 开发语言
  • Java getParameter方法案例详解
    html核心代码 <body> <font size = "5" color ="blue">圆面积计算</font><br&...
    99+
    2024-04-02
  • Java DFA算法案例详解
    1.背景 项目中需要对敏感词做一个过滤,首先有几个方案可以选择: 直接将敏感词组织成String后,利用indexOf方法来查询。 传统的敏感词入库后SQL查询。 ...
    99+
    2024-04-02
  • Java Collections.shuffle()方法案例详解
    Java.util.Collections类下有一个静态的shuffle()方法,如下: 1)static void shuffle(List<?> list) ...
    99+
    2024-04-02
  • CRITICAL_SECTION用法案例详解
          很多人对CRITICAL_SECTION的理解是错误的,认为CRITICAL_SECTION是锁定了资源,其实,CRITICAL_SECTI...
    99+
    2024-04-02
  • Java BigDecimal案例详解
    引言   float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提...
    99+
    2024-04-02
  • Java JNDI案例详解
    JNDI的理解 JNDI是 Java 命名与文件夹接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之中的一个,不少专家觉得...
    99+
    2024-04-02
  • Java Map.entry案例详解
       Map.entrySet() 这个方法返回的是一个Set<Map.Entry<K,V>>,Map.Entry 是Map中的一个接口,...
    99+
    2024-04-02
  • Java ResourceBundle案例详解
    JAVA中ResourceBundle使用详解 这个类主要用来解决国际化和本地化问题。国际化和本地化可不是两个概念,两者都是一起出现的。可以说,国际化的目的就是为...
    99+
    2024-04-02
  • Java WeakHashMap案例详解
    WeakHashMap 继承于AbstractMap,实现了Map接口。 和HashMap一样,WeakHashMap 也是一个散列表,它存储的内容也是键值对(key-value)映...
    99+
    2024-04-02
  • Java Assert.assertEquals案例详解
    junit.framework包下的Assert提供了多个断言方法. 主用于比较测试传递进去的两个参数. Assert.assertEquals();及其重载方法: 1. 如果两者一...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作