5

我正在尝试学习nio 2Java 7 中的包,但我偶然发现了该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不应该。有什么看法吗?

4

2 回答 2

14

[...] 大多数情况下,无论如何都会使用默认字符集调用该方法,

并不真地。大多数情况下,它将使用您希望文件编码的字符集来调用它。通常现在它是 UTF-8:

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

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

我认为这是一个不错的选择,可以纠正过去错误的设计决策。许多旧的 Java 方法使用默认系统编码,导致行为或应用程序不一致,例如在 Windows 和 Linux 之间。强制选择字符编码只会使您的应用程序更便携和更安全。


顺便说一句,因为您提到io.Source了类 - 请注意,它返回一个迭代器而不是List<String>Files类那样。优点:文件被延迟加载,而不是一次全部加载到巨大的ArrayList<String>. 缺点:您必须手动关闭源代码(您不能在代码片段中这样做)。

于 2012-10-03T09:06:24.467 回答
0

你得问设计者,但很可能他们和我一样认为将整个文件读入内存是不值得鼓励的。它无法扩展,并且引入了不必要的时间和空间成本。一次处理一行文件。

于 2012-10-03T10:15:58.393 回答