李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
字符串--扫描输入
Leefs
2020-01-02 AM
3850℃
2条
# 字符串--扫描输入 ### 前言 本篇讲述《Java编程思想》第13.7小节,扫描输入 ### 概述 从文本或标准输入读取数据 **代码示例** ```java public class SimpleRead { //BufferedReader:从字符输入流中读取文本并缓冲字符,以便有效的读取字符、数组和行 public static BufferedReader input = new BufferedReader( new StringReader("Sir Robin of Camelot\n22 1.61803") ); public static void main(String[] args){ try { System.out.println("What is your name?"); String name = input.readLine();//每次读取一行 即碰到"\n"结束 System.out.println(name); System.out.println("How old are you?What is your favorite double?"); System.out.println("(input:
)"); String numbers = input.readLine(); System.out.println(numbers); String[] numArray = numbers.split(" "); int age = Integer.parseInt(numArray[0]); double favorite = Double.parseDouble(numArray[1]); System.out.format("Hi %s.\n",name); System.out.format("In 5 years you will be %d.\n",age+5); System.out.format("My favorite double is %f.",favorite/2); } catch (IOException e) { System.err.println("I/O exception"); } } } ``` > 运行结果 ```java What is your name? Sir Robin of Camelot How old are you?What is your favorite double? (input:
) 22 1.61803 Hi Sir Robin of Camelot. In 5 years you will be 27. My favorite double is 0.809015. ``` 读入一行文本,对其进行分词,然后使用Integer、Double等类的各种解析方法来解析数据。StringReader将String转化为可读的流对象,然后用这个对象来构造BufferReader对象,因为我们要使用BufferReader的readLine()方法。最终我们可以使用input对象一次读取一行文本,就像从控制台读取标准输入一样。 **上方代码存在的问题:** 如果两个输入值在同一行中,我们就要必须分解这个行,才能分别翻译所需的输入值。 #### Scanner类扫描 **代码示例** ```java public class BetterRead { public static void main(String[] args) { Scanner stdin = new Scanner(SimpleRead.input);//Scanner 可以接受任何类型的 Readable 输入对象 System.out.println("What is your name?"); // 所有的输入,分词以及翻译的操作都隐藏在不同类型的 next 方法 中. String name = stdin.nextLine(); // nextLine() 返回 String System.out.println(name); System.out.println("How old are you? What is your favorite double?"); System.out.println("(input:
)"); // Scanner 直接读入 integer 和 double 类型数据 int age = stdin.nextInt(); double favorite = stdin.nextDouble(); System.out.println(age); System.out.println(favorite); System.out.format("Hi %s.\n", name); System.out.format("In 5 years you will be %d.\n", age + 5); System.out.format("My favorite double is %f.", favorite / 2); } } ``` > 运行结果 ```java What is your name? Sir Robin of Camelot How old are you? What is your favorite double? (input:
) 22 1.61803 Hi Sir Robin of Camelot. In 5 years you will be 27. My favorite double is 0.809015. ``` Scanner构造器可以接受任何类型的输入对象,如File,InputStream,String,或者Readable对象。所有的基本数据类型都有对应的next方法,包括BigDecimal和BigInteger,普通的next()方法返回下一个String。还有对应的hasNext方法,判断下一个输入分词是否所需的类型。 Scanner在输入结束时会抛出IOException异常,所以Scanner会把IOException吞掉,通过ioException()方法可以找到最近发生的异常,可以使用此方法在必要时进行检查。 ### Scanner定界符 默认情况下,Scanner是通过空白字符对输入进行分词的,但是你可以用正则表达式指定自己所需的定界符: ```java public class ScannerDelimiter { public static void main(String[] args){ Scanner scanner = new Scanner("12,42,78,99,42"); scanner.useDelimiter("\\s*,\\s*"); while(scanner.hasNextInt()){ System.out.println(scanner.nextInt()); } } } ``` > 运行结果 ```java 12 42 78 99 42 ``` 本示例通过使用逗号(包括逗号前后任意的空白字符)作为定界符,可以通过userDelimiter()来设置定界符,delimiter()方法用来返回当前正在作为定界符使用的Pattern对象。 ### 用正则表达式扫描 使用自定义正则表达式进行扫描 ```java public class ThreatAnalyzer { static String threatData = "28.27.82.151@02/10/2005\n"+ "132.27.82.151@03/10/2005\n"+ "31.27.82.151@04/10/2005\n"+ "32.27.82.151@05/10/2005\n"+ "[Next log section with different data format]"; public static void main(String[] args){ Scanner scanner = new Scanner(threatData); String pattern = "(\\d+[.]\\d+[.]\\d+[.]\\d+)@"+ "(\\d{2}/\\d{2}/\\d{4})"; while (scanner.hasNext(pattern)){ scanner.next(pattern); MatchResult match = scanner.match(); String ip = match.group(1); String date = match.group(2); System.out.format("Threat on %s from %s\n",date,ip); } } } ``` **运行结果** ```java Threat on 02/10/2005 from 28.27.82.151 Threat on 03/10/2005 from 132.27.82.151 Threat on 04/10/2005 from 31.27.82.151 Threat on 05/10/2005 from 32.27.82.151 ``` 当next()方法配合指定的正则表达式使用时,将找到下一个匹配该模式的输入部分,调用match()方法就可以获得匹配的结果。
标签:
Java
,
Java编程思想
,
字符串
,
正则表达式
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/362.html
上一篇
元旦随笔
下一篇
容器深入研究--完整的容器分类法
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
MyBatis-Plus
Yarn
JavaScript
工具
Java工具类
SpringCloudAlibaba
数据结构
Quartz
设计模式
MyBatis
Kafka
Elasticsearch
正则表达式
nginx
Shiro
Java编程思想
Docker
Kibana
Spark
Jquery
机器学习
JavaSE
Python
排序
pytorch
Hadoop
链表
JavaWeb
NIO
DataX
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭