繁体   English   中英

为什么 Files.readAllBytes() 不接受编码参数?

[英]Why is Files.readAllBytes() not accepting an encoding parameter?

不确定我是否正确理解这一点,但我在想,当我需要将文件内容作为字节数组存储在 Java 中时,我需要为 Java 提供文件的编码。

如果我想用一个准备好的例子来做,我需要做类似的事情:

Reader reader = Files.newBufferedReader(myFilePath, StandardCharsets.ISO_8859_1)

为什么我不能在使用Files.readAllBytes(myFilePath)时指定文件的编码? 我想做类似Files.readAllBytes(myFilePath, StandardCharsets.ISO_8859_1)的事情。

我弄错了吗?

是的,你错了。 但是很容易出错……如果您不了解 Java 建模文本数据的方式。

您将 Reader / Writer 的功能与 InputStream / OutputStream 的功能混为一谈。

  • 前者允许您使用(读取)和生成(写入)字符; 即使用 Unicode 代码点表示的文本数据。
  • 后者允许您消耗(读取)和产生(写入)字节; 即二进制或二进制编码数据。

现在很多ReaderWriter类实际上同时执行两个功能; 即获取或接收数据并将数据转换为字符/从字符转换。 在某些情况下,您可以通过提供编码告诉 class 如何执行转换步骤。

相比之下, InputStreamOutputStream是字节的源或接收器,通常1不进行任何字符转换。

对于Files.readAllBytes ,该方法是从文件中读取所有字节并将它们放入字节数组中。 它不需要Charset参数,因为它不是为进行任何解码而设计的。

另一方面, Files.readAllLines确实需要一个Charset 那是因为它将文件内容作为表示文件String对象数组提供。 在将字节转换为 Java String时,您需要说明字节表示的文本/字符是如何编码的。


1 - 假设它可以......但你会看到 Java 不提供像ReaderInputStreamWriterOutputStream这样的类。 几乎不需要它们。

不,如果要将字节表示为String (即文本),则只需要一个Charset集,因为字节的含义取决于编码。

byte[] bytes = Files.readAllBytes(Paths.get("/temp.txt"));
String text = new String(bytes, StandardCharsets.ISO_8859_1);

根据编码,单个字节数组可以表示多个不同的字符串,并且数组中的字节与编码无关,因此能够将编码作为参数传递给这个 function 是没有意义的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM