为什么Java 7中没有Files.readAllLines(String path)方法?

5
我正在学习Java 7中的nio2包,偶然发现了Files.readAllLines(Path p, Charset cs)方法。我觉得这个方法很有用,但我认为应该有一个没有cs参数的版本,就像下面这样:
 public static List<String> readAllLines(String path)
    throws IOException
{ return readAllLines(Paths.get(path), Charset.defaultCharset());}

我认为大多数情况下该方法会以默认字符集调用,所以为什么不使用快捷方式呢?有没有什么关于字符集的问题我不知道,这是否证明不需要该方法呢?我感到很惊讶,因为Scala有此选项:

Source.fromFile("fileName").getLines

所以我不明白为什么Java不能这样做。有什么看法吗?

3
也许他们想要 décourager 使用默认字符集,或者他们想要最小化添加的方法数量。 - Peter Lawrey
3
很遗憾,给出负评的人没有留下评论说明原因。 - Oliver
2
假设默认字符集是导致宇宙陷入字符编码地狱的根源。 - Isaac
1
@OliverStutz,也许他是nio2开发者之一 :) - Chirlo
新闻快报:readAllLines(String path) 已经在Java SE 8中添加,且默认字符集始终为UTF-8。 - Nayuki
2个回答

14

[...] 大多数情况下该方法会使用默认的字符集被调用。

事实并非如此。大多数情况下,该方法将使用您期望该文件编码的字符集进行调用。通常情况下,现在使用的是UTF-8:

Files.readAllLines("fileName", StandardCharsets.UTF_8)

您的应用程序可以在多个平台和操作系统上执行,使用不同的默认字符编码。您不希望仅因此而使应用程序出现故障。

我认为这是一个好选择,纠正过去错误决策。许多旧的Java方法使用默认系统编码,在Windows和Linux之间导致不一致的行为或应用程序等问题。强制选择字符编码只会使您的应用程序更具可移植性和安全性。


顺便提一下,因为您提到了io.Source类 - 请注意它返回一个迭代器,而不是像Files类一样返回List<String>。优点:文件被懒加载,不会一次性加载到巨大的ArrayList<String>中。缺点:您必须手动关闭源(这在您的代码片段中无法完成)。


+1 他们真的应该弃用没有字符集等内容的String.getBytes() - artbristol
1
我会说,我期望文件编码的字符集是我的默认字符集(在我的情况下是UTF_8 :))。如果UTF_8在任何情况下都是最合理的选项,那么他们可以将其作为默认选项。 - Chirlo
@Chirlo:+1,这是一个公正的假设。但我仍然认为明确字符集是一个好主意。 - Tomasz Nurkiewicz
1
那么,假设我希望有一个Files.readAllLinesWithDefaultCharset(file)方法:) 至少对我来说会有所不同。顺便说一句,感谢关于io.Source的提示。 - Chirlo

0
你可以问设计者,但很有可能他们和我持有相同的观点:将整个文件读入内存并不被鼓励。这样做不具可扩展性,并且会引入不必要的时间和空间成本。应该逐行处理文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接