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

Is there any parsing when reading 'clean' text file using Scanner?

提问人:Stefan 提问时间:9/6/2020 更新时间:9/7/2020 访问量:190

问:

我知道那件事:

解析是将某种数据转换为另一种数据的过程 的数据。

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

BufferedReader 比 Scanner 快,因为 BufferedReader 没有 需要解析数据。

所以我的问题是,如果我只读取文本文件(纯字符)并且我没有进行任何解析,那么使用速度如何比使用慢?有没有我不知道的解析?ScannerBufferedReader

或者从以下代码的角度来看,这里怎么会因为解析而比使用慢?ScannerBufferedReader

//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

Java 解析 IO java.util.scanner bufferedreader

评论

0赞 OneCricketeer 9/6/2020
显示这些陈述的来源?
0赞 OneCricketeer 9/6/2020
但是,是的,有解析可以知道何时找到结束分隔符
0赞 NomadMaker 9/6/2020
确定这一点的唯一方法是通过基准测试。老实说,在你进入数十万行之前,我怀疑速度的不同是否重要。

答:

1赞 rici 9/7/2020 #1

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

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

评论

0赞 Stefan 9/7/2020
谢谢你的回答。我以为术语解析仅在转换时使用。例如,nextInt() 将是解析方法,因为它将 String 转换为 int。解析在这里意味着什么?你说将流分成行是解析的形式。但从技术上讲,它没有转换任何东西,对吧?
1赞 rici 9/7/2020
@stefan:解析是指将字符串分析成其组成部分。事实上,“解析”一词和“部分”一词之间的相似性并非巧合;它实际上是“解析”的词源。因此,从非常原始的意义上说,您可以将输入解析为单个行(或字段)。最初,解析适用于句子,意味着弄清楚每个单词的词性(这种用法可以追溯到计算机之前的几个世纪)。转换实际上与解析关系不大;这充其量只是一种副作用。