我正在尝试学习Java 7中的nio 2
包,我偶然发现了Files.readAllLines(Path p, Charset cs)
方法。我发现它非常有用,但我认为应该有一个没有cs
参数的版本,就像:
public static List<String> readAllLines(String path)
throws IOException
{ return readAllLines(Paths.get(path), Charset.defaultCharset());}
我确信无论如何大多数时候都会使用默认的Charset调用该方法,所以为什么没有shorcut。是否有任何关于charsets的遗漏可以证明没有这种方法的理由?我很惊讶,因为Scala有这个选项:
Source.fromFile("fileName").getLines
所以我不明白为什么Java不应该。有意见吗?
答案 0 :(得分:14)
[...]大多数情况下,无论如何都会使用默认的Charset调用该方法,
不是真的。大多数情况下,它会使用您期望文件编码的字符集进行调用。通常这些天它是UTF-8:
Files.readAllLines("fileName", StandardCharsets.UTF_8)
您的应用程序可以使用不同的默认字符编码在多个平台和操作系统上执行。您不希望您的应用程序因此而中断。
我认为这是一个很好的选择,从过去修复错误的设计决定。许多旧Java方法使用默认系统编码,导致不一致的行为或应用程序,例如在Windows和Linux之间。强制选择字符编码只会使您的应用程序更加便携和安全。
BTW因为你提到了io.Source
类 - 请注意它返回一个迭代器而不是List<String>
类Files
。优点:文件是懒惰加载的,而不是一次性加载到巨大的ArrayList<String>
。缺点:您必须手动关闭源代码(在代码段中无法执行此操作)。
答案 1 :(得分:0)
你不得不问设计师,但他们很可能会分享我的观点,即将整个文件读入内存并不值得鼓励。它不会扩展,并且会带来不必要的时间和空间成本。一次处理一行文件。