为什么在Java7中不是Files.readAllLines(字符串路径)?

为什么在Java7中不是Files.readAllLines(字符串路径)?,java,java-7,nio2,Java,Java 7,Nio2,我试图学习Java7中的NIO2包,我偶然发现了Files.readAllLines(Path p,Charset cs)方法。我觉得它非常有用,但我认为应该有一个没有cs参数的版本,就像: public static List<String> readAllLines(String path) throws IOException { return readAllLines(Paths.get(path), Charset.defaultCharset());} 所以我

我试图学习Java7中的
NIO2
包,我偶然发现了
Files.readAllLines(Path p,Charset cs)
方法。我觉得它非常有用,但我认为应该有一个没有
cs
参数的版本,就像:

 public static List<String> readAllLines(String path)
    throws IOException
{ return readAllLines(Paths.get(path), Charset.defaultCharset());}
所以我不明白为什么Java不应该。有什么看法吗

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

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

Files.readAllLines("fileName", StandardCharsets.UTF_8)
您的应用程序可以在多个平台和操作系统上执行,使用不同的默认字符编码。您不希望您的应用程序因此而中断

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



顺便说一句,因为您提到的是
io.Source
类-请注意,它返回的是迭代器,而不是
列表
,就像
文件
类那样。优点:文件是惰性加载的,而不是一次加载到巨大的
ArrayList
。缺点:您必须手动关闭源代码(这在代码段中是无法做到的)。

您必须询问设计人员,但他们很可能同意我的观点,即不鼓励将整个文件读取到内存中。它不可扩展,并且会带来不必要的时间和空间成本。一次处理一行文件。

也许他们不想使用默认字符集,或者他们想尽量减少添加的方法数量。很遗憾,downvoter没有评论为什么使用默认字符集会让整个世界陷入字符编码的地狱。@OliverStutz,也许他是nio2开发人员之一:)News flash:是在Java SE 8中添加的,假设的字符集总是UTF-8。+1实际上他们应该反对
String.getBytes()
没有字符集之类的东西。我想说,我希望文件编码的字符集是我的默认字符集(在我的例子中是UTF_8:)。如果UTF_8在任何情况下都是最合理的选择,那么他们可以将该选择用作default@Chirlo:+1,这是一个合理的假设。但我仍然认为将字符集显式化是一个好主意。假设我想要一个
文件。readAllLinesWithDefaultCharset(file)
方法:)至少对我来说会有所不同。顺便说一句,
io.Source
上的提示为+1。
Files.readAllLines("fileName", StandardCharsets.UTF_8)