Scanner的优劣
Scanner常常被用来替代更原始的读取输入流的方式。相较于其他读取方法来说,Scanner的优点包括:
- 简化的输入方式:Scanner有各种方便的next方法可以轻松读取不同类型的数据
- 自动地去除空格和换行符:不同于更原始的方式,Scanner会自动忽略在读取输入时输入之间的空格和换行符
- 更方便和高效的字符串处理能力:Scanner可以套用正则表达式来按照特定格式读取文本数据
基本用法
Scanner的最基本用法是构造一个Scanner对象,该对象是基于数据源(文件、字符串等)的,并且需要指定数据源的类型,具体如下:
Scanner in = new Scanner(System.in); //读取标准输入 Scanner fileIn = new Scanner(new File(\"filename.txt\")); //读取文件输入 Scanner strIn = new Scanner(\"This is a string.\");//读取字符串输入
创建好Scanner对象之后,就可以使用Scanner提供的next系列方法来方便地读取输入了:
String input = in.next(); //读取下一个字符串,空格或换行符结束 int num = in.nextInt(); //读取下一个整数 double d = in.nextDouble(); //读取下一个double
除此之外,Scanner还有各种其他类型的读取方法和用于控制扫描器的各种方法,更加详细的用法可以参考Java官方文档。
不同情景下的技巧
在实际使用Scanner时,不同的输入情景可能需要不同的处理方法。在这里,我们将介绍一些在特定情景下使用Scanner时的技巧:
读取文件中的数据
如果我们需要只读取文件中的部分内容,而不是全部内容,那么可以结合使用Scanner和Java的IO库来实现。比如,我们希望只读取文件中的第n行:
public static String readLine(int n) { try (Scanner scanner = new Scanner(new File(\"filename\")); BufferedReader reader = new BufferedReader(new FileReader(\"filename\"))) { String line = \"\"; for(int i = 0; i < n; i++){ line = reader.readLine(); //读取第n行数据 } return line; //返回第n行数据 } catch (IOException e) { e.printStackTrace(); } return \"\"; }
读取大文件中的数据
对于较大的文件,直接使用Scanner可能会导致内存溢出。在这种情况下,我们可以使用Scanner的skip方法来跳过不需要的部分,从而减少内存占用的压力:
Scanner sc = new Scanner(new FileInputStream(\"bigfile.txt\"), \"UTF-8\"); sc.useDelimiter(\"\ \"); // 以换行符作为分隔符 while (sc.hasNext()) { String line = sc.next(); if (line.startsWith(\"START\")) { break; // 跳过文件前部分 } } while (sc.hasNext()) { // 读取文件中后续的数据 String line = sc.next(); System.out.println(line); } sc.close();
指定自定义分隔符
默认情况下,Scanner以空格和换行符作为分隔符。但如果数据源中的数据是用不同分隔符分隔的,那么我们需要在Scanner中指定自定义分隔符。比如,如果数据源中的每行数据由竖线隔开,那么我们可以这样写:
Scanner scan = new Scanner(System.in); scan.useDelimiter(\"\\\\s*\\\\|\\\\s*\"); // 以竖线作为分隔符 while(scan.hasNext()) { int value1 = scan.nextInt(); String value2 = scan.next(); System.out.println(\"value1=\" + value1 + \", value2=\" + value2); }
总体来说,Scanner是读取输入数据的一种高效、方便的方式。当然,在使用时需要注意特定的情景下可能需要不同的处理方法,同时还要避免由于文件过大或其他原因而导致内存溢出的问题。