3. Scanner
有无数 Java 工具能帮助您构建解析器,很多函数语言已成功构建解析器函数库(解析器选择器)。但如果要解析的是逗号分隔值文件,或空格分隔文本文件,又怎么办呢?大多数工具用在此处就过于隆重了,而
String.split() 又不够。(对于正则表达式,请记住一句老话:“ 您有一个问题,用正则表达式解决。那您就有两个问题了。”)
Java 平台的 Scanner 类会是这些类中您最好的选择。以轻量级文本解析器为目标,Scanner 提供了一个相对简单的 API,用于提取结构化文本,并放入强类型的部分。想象一下,如果您愿意,一组类似 DSL 的命令(
源自 Terry Pratchett Discworld 小说)排列在文本文件中,如清单 7:
清单 7. Igor 的任务
      fetch 1 head 
      fetch 3 eye 
      fetch 1 foot 
      attach foot to head 
      attach eye to head 
    admire  您,或者是本例中称为 Igor的私仆,能轻松使用 Scanner 解析这组违法命令,如清单 8 所示:
清单 8. Igor 的任务,由 Scanner 解析
import java.io.*; 
import java.util.*; 
 public class Igor   implements IPersonalServant 
 {     
     public boolean can(String cmd)
     {        
            if (cmd.equals("fetch body parts"))
                   return true;
            if (cmd.equals("attach body parts"))          
                   return true;   
            else       
                 return false; 
      }     
     public void process(File commandFile)  throws FileNotFoundException    
     {  
             Scanner scanner = new Scanner(commandFile);  // Commands come in a verb/number/noun or verb form  
            while (scanner.hasNext())   
             {           
                      String verb = scanner.next(); 
                           if (verb.equals("fetch")) 
                           {                
                                    int num = scanner.nextInt();  
                                    String type = scanner.next();     
                                     fetch (num, type);        
                           }       
                          else if (verb.equals("attach"))  
                          {              
                                  String item = scanner.next();          
                                  String to = scanner.next();            
                                  String target = scanner.next();   
                                  attach(item, target);  
                          } 
                         else if (verb.equals("admire"))
                         {           
                                         admire();      
                          }          
                        else  
                          {           
                                  System.out.println("I don't know how to "+ verb + ", marthter.");     
                          }
             }  
        }      
      public void fetch(int number, String type)  
      {     
              if (parts.get(type) == null)
               {       
                       System.out.println("Fetching " + number + " " + type + (number > 1 ? "s" : "") + ", marthter!");   
                        parts.put(type, number);   
                }
               else 
               {     
                     System.out.println("Fetching " + number + " more "  + type + (number > 1 ? "s" : "") + ", marthter!"); 
                     Integer currentTotal = parts.get(type); 
                     parts.put(type, currentTotal + number);  
               } 
             System.out.println("We now have " + parts.toString());   
      }
     public void attach(String item, String target)
     {   
          System.out.println("Attaching the " + item + " to the " +  arget + ", marthter!");
      }
     public void admire()
     {    
          System.out.println("It'th quite the creathion, marthter");
     }    
    private Map<String, Integer> parts = new HashMap<String, Integer>();
 }   假设 Igor 已在 ServantLoader 中注册,可以很方便地将 can() 调用改得更实用,并重用前面的 Servant 代码,如清单 9 所示:
清单 9. Igor 做了什么
import java.io.*; 
import java.util.*; 
public class Servant
 {     
         public static void main(String[] args)throws IOException    
          {   
              ServiceLoader<IPersonalServant> servantLoader = ServiceLoader.load(IPersonalServant.class);
              IPersonalServant i = null;   
              for (IPersonalServant ii : servantLoader)
                      if (ii.can("fetch body parts"))  
                                i = ii;    
                     if (i == null)  
                                 throw new IllegalArgumentException("No suitable servant found");
                   for (String arg : args) 
                    {   
                              i.process(new File(arg));      
                     } 
            }
 }  
真正 DSL 实现显然不会仅仅打印到标准输出流。我把追踪哪些部分、跟随哪些部分的细节留待给您(当然,还有忠诚的 Igor)。

转载于:https://blog.51cto.com/zhaohaiyang/411339

java Scanner具有神奇的作用可惜大部分java开发人员不知相关推荐

  1. java scanner 用不了_java Scanner具有神奇的作用可惜大部分java开发人员不知

    3. Scanner 有无数 Java 工具能帮助您构建解析器,很多函数语言已成功构建解析器函数库(解析器选择器).但如果要解析的是逗号分隔值文件,或空格分隔文本文件,又怎么办呢?大多数工具用在此处就 ...

  2. java程序设计实验报告代写_代写file I/O作业、代写java Scanner I/O程序、代写java编程作业、代做java实验报告...

    代写file I/O作业.代写java Scanner I/O程序.代写java编程作业.代做java实验报告 日期:2018-09-05 03:40 ?Objectives oCreate a pr ...

  3. java index.jsp为什么不默认跳转_Java开发人员怎么面试 常见Redis面试题有哪些

    Java开发人员怎么面试?常见Redis面试题有哪些?Redis是目前各大企业都在使用的人们技术,也是企业选拔人才时考核的一个难题.有很多同学只是简单了解Redis的应用,但对于为什么要用Redis以 ...

  4. 面向 Java 开发人员的区块链链代码

    面向 Java 开发人员的链代码简介 点击查看视频演示查看抄本 您或许听说过区块链,但可能不确定它对 Java™ 开发人员有何用.本教程将帮助大家解惑.我将分步展示如何使用 Hyperledger F ...

  5. java垃圾回收机制优化_JVM性能优化--Java的垃圾回收机制

    一.Java内存结构 1.Java堆(Java Heap) java堆是java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,在虚拟机启动时创建.此内存区域的唯一目的就是存放对象实例 ...

  6. java读取csv文件_使用扫描仪读取Java中的CSV文件

    java读取csv文件 We can use Java Scanner Class to read CSV File in java. 我们可以使用Java扫描程序类在Java中读取CSV文件. 读取 ...

  7. 针对 Java 开发人员的 C# 编程语言

    •    C# 语言引入了一些新的语言构造,如 foreach.索引器.属性.委托.运算符重载和其他语言构造.在本文后面我们将更详细地讨论这些构造.    本页内容  源文件约定  顶层声明  完全限 ...

  8. java开发人员_Java 8:开发人员怎么看?

    java开发人员 由于Java 8发行倒计时已经开始,因此Java开发人员似乎肯定已经准备好参与其中. 根据Typesafe的一项调查 ,参与其中的开发人员中有65%回答说他们将在24个月的计划中迁移 ...

  9. Java 8:开发人员怎么看?

    由于Java 8发行倒计时已经开始,因此Java开发人员似乎肯定已经准备好参与其中. 根据Typesafe的一项调查 ,参与其中的开发人员中有65%回答说他们将在24个月的计划中迁移到Java 8,而 ...

最新文章

  1. 润乾集算报表优化应用结构之混合数据源
  2. 火星上真的有液态水?!欧洲科学家新发现登上《自然·天文学》
  3. jmeter中文_JMeter安装配置
  4. 【转】XCode: duplicate symbol 解决方案
  5. expdp / impdp 用法详解(Oracle)
  6. 【yml】YAML 语言教程--- 字符串
  7. 牛客网《BAT面试算法精品课》学习笔记
  8. Matplotlib图例中文乱码
  9. RESTful 架构详解
  10. RobotFramework自动化测试框架的基础关键字(五)
  11. android中的xml布局文件如何引用另一个xml布局文件,引用另一个layout.xml文件而不复制它...
  12. 双向口 与 准双向口 区别
  13. vscode 生成mvc_ASP.NET MVC 简介(附VS2019和VSCode版示例)
  14. Android之帮助文档
  15. gvim 命令行粘贴_vi/vim复制粘贴命令
  16. matlabR2017b 载入libsvm
  17. docker 升级版本
  18. 电工学的MATLAB实践,基于Matlab/Simulink的电工学电路仿真
  19. POJ 1945 Power Hungry Cows(打表技巧)
  20. 高翔视觉slam十四讲书籍习题(第三讲)

热门文章

  1. .NET Core webapi 允许put请求方式配置文件
  2. 下的生产环境was重新启动不同意,怎么做?
  3. 【LeetCode】154. Find Minimum in Rotated Sorted Array II (3 solutions)
  4. eclipse的remote search
  5. Linux C SQLite3 编程
  6. 第三十六讲 ASP.NET中的Web服务(三)
  7. Jenkins遇到问题一:jenkins配置权限不对导致无法登陆或者空白页面解决办法
  8. android Button背景高度被拉伸问题--解决方案
  9. Python requests 多线程抓取 出现HTTPConnectionPool Max retires exceeded异常
  10. Python 使用sys.exc_info自己捕获异常详细信息