有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用扫描器读取“干净”文本文件时,是否有任何解析?

我知道:

Parsing is the process of turning some kind of data into another kind of data.

但后来我也遇到了ScannerBufferedReader之间的区别:

BufferedReader is faster than Scanner because BufferedReader does not need to parse the data.

所以我的问题是,如果我只是阅读文本文件(纯字符),而我没有进行任何解析,那么使用Scanner比使用BufferedReader慢多少呢?有我不知道的解析吗

或者从下面的代码角度来看,这里的Scanner由于解析而比使用BufferedReader慢多少

//1
BufferedReader bufferedReader = new BufferedReader(new FileReader("xanadu.txt"));
System.out.println(bufferedReader.readLine());
    
//2
Scanner scanner = new Scanner(new FileReader("xanadu.txt"));
scanner.useDelimiter("\n");
System.out.println(scanner.next());

我不明白为什么Scanner会因为解析而变慢,而从技术上讲,我并没有解析任何数据


共 (1) 个答案

  1. # 1 楼答案

    将输入流分成行是一种(非常有限的)解析形式,但正如您所说的BufferedReader也可以做到这一点。如果有区别的话,那就是BufferedReader可以使用高度优化的过程来实现单个用例(将流划分为行),而Scanner需要能够更加灵活(将流划分为由任意字符串或正则表达式分隔的标记)。灵活性几乎总是有代价的,尽管如果不做一些基准测试,你就不知道成本是多少。(而且它可能非常小,因为可以想象Scanner针对它能够识别的特殊情况优化了算法。)

    简而言之,“因为解析”并不能很好地解释为什么一个接口比另一个接口慢。但是,越灵活、越精确地解析输入,所需的时间就越长