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

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

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

例如,如果我想用 ready 来做,我需要做类似的事情:

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

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

的事情

我是不是理解错了?

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

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

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

是的,你误会了。但是很容易弄错...如果您不理解 Java 文本数据建模方法。

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

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

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

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

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

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


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