一、Scanner
- 一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。
- Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配。
- 然后可以使用不同的 next 方法将得到的标记转换为不同类型的值。
- 扫描操作可能被阻塞,而等待信息的输入。
- jdk1.5开始的
public final class Scanner implements Iterator<String> { //构造一个新的 Scanner,它生成的值是从指定文件扫描的。来自该文件的字节通过底层平台的默认字符集转换成字符 public Scanner(File source) throws FileNotFoundException{} //构造一个新的 Scanner,它生成的值是从指定文件扫描的。来自该文件的字节通过指定字符集转换成字符。 public Scanner(File source, String charsetName) throws FileNotFoundException{} //构造一个新的 Scanner,它生成的值是从指定的输入流扫描的。取自该流的字节通过底层平台的默认字符集转换成字符 public Scanner(InputStream source){} //构造一个新的 Scanner,它生成的值是从指定的输入流扫描的。来自该流的字节通过指定字符集转换成字符。 public Scanner(InputStream source, String charsetName){} //构造一个新的 Scanner,它生成的值是从指定字符串扫描的 public Scanner(String source){} //关闭此扫描器。 public void close(){} //返回此 Scanner 当前正在用于匹配分隔符的 Pattern public Pattern delimiter(){} //试图在忽略分隔符的情况下查找下一个指定模式。 public String findInLine(Pattern pattern){} //试图在忽略分隔符的情况下查找下一个从指定字符串构造的模式 public String findInLine(String pattern){} //如果此扫描器的输入中有另一个标记,则返回 true。在等待要扫描的输入时,此方法可能阻塞。扫描器将不执行任何输入。 public boolean hasNext(){} //如果下一个完整标记与指定模式匹配,则返回 true。完整标记以与分隔模式匹配的输入信息为前后缀。在等待输入信息时,此方法可能阻塞。扫描器不执行任何输入。 public boolean hasNext(Pattern pattern){} public boolean hasNext(String pattern){} //查找并返回来自此扫描器的下一个完整标记。完整标记的前后是与分隔模式匹配的输入信息 public String next(){} //如果下一个标记与指定模式匹配,则返回下一个标记。 public String next(Pattern pattern){} public String next(String pattern){} //将输入信息的下一个标记扫描为一个 int。 public int nextInt(){} public int nextInt(int radix){} nextShort()也可以指定基数 //返回此扫描器的默认基数 public int radix(){} //在忽略分隔符的情况下跳过与指定模式匹配的输入信息。 public Scanner skip(Pattern pattern){} public Scanner skip(String pattern){} //将此扫描器的分隔模式设置为指定模式 public Scanner useDelimiter(Pattern pattern){} public Scanner useDelimiter(String pattern){} //将此扫描器的默认基数设置为指定基数。 public Scanner useRadix(int radix){} }
二、示例
import java.util.*; class ScannerDemo { public static void main(String[] args) { System.out.println("请输入若干个数,每输入一个数用回车确认"); System.out.println("最后输入一个非数字结束输入操作"); Scanner scan = new Scanner(System.in); double sum = 0; int m = 0; while(scan.hasNextDouble()) { double x = scan.nextDouble(); m = m + 1; sum = sum + x; } System.out.println(m+"个数的和为"+sum); System.out.println(m+"个数的平均值是"+(sum/m)); } }
import java.util.*; import java.io.*; /** *读取并分析文本文件:hrinfo.txt, *文本文件的内容如下:老赵,28,feb-01,true小竹,22,dec-03,false阿波,21,dec-03,false凯子,25,dec-03,true */ class ScannerDemo { public static void main(String[] args) throws Exception { readFile("f:\\hrinfo.txt"); } private static void readFile(String fileName)throws Exception { Scanner scan = new Scanner(new File(fileName)); scan.useDelimiter(System.getProperty("line.separator")); while(scan.hasNext()) { parseLine(scan.next()); } scan.close(); } private static void parseLine(String line) { Scanner scan = new Scanner(line); scan.useDelimiter(","); String name = scan.next(); int age = scan.nextInt(); String date = scan.next(); boolean b = scan.nextBoolean(); System.out.println("姓名:"+name+" 年龄:"+age+" 入司时间:"+date+" 验证标记:"+b); } }
import java.util.*; class ScannerDemo { public static void main(String[] args) { Scanner scan = new Scanner("zhangsan..20..lisi...15......wangwu.18...ermazi.19.haha..20"); scan.useDelimiter("\\.+"); while(scan.hasNext()) { System.out.println(scan.next()); System.out.println(scan.nextInt()); } } }
import java.util.*; class ScannerDemo { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.print("请输入姓名:"); String name = scan.next(); System.out.println("请输入语文数学英语成绩,用空格隔开:"); double yuWen = scan.nextDouble(); double shuXue = scan.nextDouble(); double yingYu = scan.nextDouble(); System.out.println("姓名:"+name+" 语文:"+yuWen+" 数学:"+shuXue+" 英语:"+yingYu+" 总分:"+(yuWen+shuXue+yingYu)); } }
import java.util.*; class ScannerDemo { public static void main(String[] args) { Scanner scan = new Scanner(System.in); while(true) { String line = scan.nextLine(); if(line.equals("over")) break; System.out.println(">>>"+line); } } }
import java.util.*; class ScannerDemo { public static void main(String[] args) { Scanner scan = new Scanner(System.in); while(true) { String line = scan.next(); if(line.equals("over")) break; System.out.println(">>>"+line); } } }
import java.util.*; class ScannerDemo { public static void main(String[] args) throws Exception { Scanner scan = new Scanner("123 asdf sd 45 789 sdf asdfl,sdf.sdfl,asdf ......asdfkl las"); scan.useDelimiter(" +|,|\\.+"); while(scan.hasNext()) { System.out.println(scan.next()); } } }