java Scanner类用于从命名终端输入数据

网上查阅的说法如下:
Scanner使用分隔符模式将一串输入分解为一个个标记,默认情况下该分隔符模式与空白和Tab这些空白字符匹配。然后可以使用不同的next方法将得到的标记转换为不同类型的值。
useDelimiter方法设置的是对数据流分割的字符,比如next()方法必须从输入流中获取到useDelimiter设置的字符串才返回,不然一直阻塞。一直等待输入,并没有扫描到下一个分隔符

    s.useDelimiter(",");// 设置tocken的分割字符串,设置了对一个数据流怎么去分割的字符串,这个改为,号

例如:Scanner sc = new Scanner(System.in);
其构造函数参数是待解析的输入源,可以是File对象、Stream对象,或是一个String,然后还有java.lang.Readable对象。

定制分隔符的方法是sc. useDelimiterj(Pattern),然后使用while循环和sc.next()来依次取出Scanner解析后的元素,还可以特定取sc.nextInt()/ nextLong()/ nextShort()/ nextDouble()等等。

最后,不管输入源是不是Stream,都请执行sc.close()方法,关闭Scanner,它同时会关闭其输入源

 import java.io.*;
 import java.util.*;
 public class ScanFar {
  public static void main(String[] args) throws IOException {
    Scanner sc = new Scanner(new BufferedReader(new FileReader("words.txt")));
    //sc.useDelimiter("t");// 默认是空格
    while (sc.hasNext()) {
      System.out.println(sc.next());
    }
     sc.close();
   } 

如果words.txt文件中的内容是:“So she went into the garden…” 那么结果如下,整个字符串按空格来分为了多个String对象
So
she
went
into
the
garden…

如果sc.useDelimiter(“t”),那么结果按字母t来分解,如下:
So she wen
in
o
he garden…

发现被定义为分隔符的字母t被消除了,不作为结果的一部分。

以前常常遇到要从字符串中取出某些部分,有了Scanner类,比Split()方便灵活多了。

注:sc.next()是从结果集中连续取值,如果要从一串字符中取出间插在中间的数字, 那么使用sc.nextInt(),但是如果结果集中的下一个元素不是int类型的话就会抛出异常,要达到这一目的, 在循环中添加if条件判断即可,如下:

While(sc.hasNext()){
 if(sc.hasNextInt()){ // sc.hasNextShort()/hasNextDouble/…等各种基本数据类型
  //做事件…
 }
 else{
  next();//直接跳过
 }

关于hasnext()方法:
hasNext()是Scanner类的一个方法,判断是否有输入,有输入项,str .hasNext()为true,没有输入项,str .hasNext()为false。java api解释的就是操蛋。不说人话。

Scanner s = new Scanner(System.in);
while(in.hasNext){
  string s= in.next();
}
//对于这段代码在命令行下他是不可能停下来的。因为scanner获取到标准输入流后hasNext一直返回true

对于这个网络上给出下面的解决方法。

//这段代码的功能是只要你不输入exit这个单词进去,就一直循环下去,
//当你输入exit这个单词进去后,hasnext返回true,
//我不解的是当我对sc.useDelimiter(",");这个语句设置字符串分割字符时候,执行时候
//输入exit也不会结束while循环了。不能理解。请大神解释。
    Scanner sc = new Scanner(System.in);
        // sc.useDelimiter(",");
        while (!sc.hasNext("exit")) {
            System.out.println("start");
            System.out.println(sc.next());
        } 

感觉Scanner设计的真蛋疼,java api说明文档说的遮遮掩掩。api设计的巨难用。

提供一个输入exit字符串可以退出循环的版本

    Scanner s = new Scanner(System.in);
        s.useDelimiter(",");// 设置tocken
        System.out.println(s.delimiter());
        while (s.hasNext()) {
            // System.out.print("hasNext: " + s.hasNext());
            if (s.hasNext(Pattern.compile("exit"))) {
                System.out.println("exit");//判定输入的字符串为exit时候退出
                break;
            } else {
                System.out.print("start:\t");
                System.out.println(s.next());
            }

        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值