gpt4 book ai didi

java - 将整个文件读入单个字符串与逐行读取相比有哪些优点和缺点?

转载 作者:行者123 更新时间:2023-11-30 08:12:22 26 4
gpt4 key购买 nike

具体来说,我的最终目标是将文件中的每个逗号分隔词存储在 List<String> 中。我想知道我应该采用哪种方法。

方法一:

String fileContents = new Scanner(new File("filepath")).useDelimiter("\\Z").next();
List<String> list = Arrays.asList(fileContents.split("\\s*,\\s*"));

方法二:

Scanner s = new Scanner(new File("filepath")).useDelimiter(",");
List<String> list = new ArrayList<>();
while (s.hasNext()){
list.add(s.next());
}
s.close();

最佳答案

方法#1 会将整个文件读入内存。这有几个与性能相关的问题:

  • 如果文件很大,占用大量内存。
  • 由于字符需要通过Scanner.next()调用来累积,字符可能需要复制2次甚至3次。
  • 由于您将通用模式匹配引擎用于非常特定的目的,因此还存在其他低效率问题。

方法 #3(这是方法 #1,文件读取做得更好)解决了许多效率问题,但您仍然将整个文件内容保存在内存中。

方法 #2 从内存使用的角度来看是最好的,因为您不会将整个文件内容保存为单个字符串或缓冲区1。性能也可能是最好的,因为(我的直觉说)这种方法至少避免了一个字符副本。

但是,如果这真的很重要,您应该对备选方案进行基准测试,同时牢记两点:

  • “过早优化”通常是浪费精力。 (或者换句话说,这部分代码的性能很可能真的无关紧要。性能瓶颈可能在其他地方。)
  • 编写 Java 基准测试存在很多缺陷,这些缺陷可能导致虚假的性能指标和错误的结论。

另一件需要注意的事情是,您正在尝试做的事情(按顺序创建所有“单词”的列表)不会缩放。对于足够大的输入文件,应用程序将耗尽堆空间。如果您预计在大于 100Mb 左右的输入文件上运行它,它可能会开始成为一个问题。

解决方案可能是将您的处理转换为更基于“流”的处理……这样您就不需要在内存中拥有所有单词的列表。

这与方法 #1 的问题本质上是同一个问题。


1 - 除非文件很小并且适合缓冲区......然后整个问题基本上没有实际意义。

关于java - 将整个文件读入单个字符串与逐行读取相比有哪些优点和缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30552098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com