为什么 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 代码点表示的文本数据。
- 后者允许您消费(读取)和生产(写入)字节;即二进制或二进制编码数据。
现在许多Reader
和Writer
class实际上同时执行两个功能;即获取或接收数据并将数据转换为字符/从字符转换。在某些情况下,您可以通过提供编码告诉 class 如何执行转换步骤。
相比之下,InputStream
或 OutputStream
是字节的源或汇,通常 1 不进行任何字符转换。
在 Files.readAllBytes
的情况下,该方法是从文件中读取所有字节并将它们放入字节数组中。它不需要 Charset
参数,因为它不是为进行任何解码而设计的。
另一方面,Files.readAllLines
确实需要 Charset
。这是因为它将文件内容作为代表文件 行 的 String
对象数组传递。在将字节转换为 Java String
时,您需要说明字节表示的文本/字符是如何编码的。
1 - 假设它可以......但你会看到 Java 不提供 class 像 ReaderInputStream
或 WriterOutputStream
.几乎不需要它们。
不确定我是否理解正确,但我在想当我需要将文件内容作为字节数组存储在 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 代码点表示的文本数据。
- 后者允许您消费(读取)和生产(写入)字节;即二进制或二进制编码数据。
现在许多Reader
和Writer
class实际上同时执行两个功能;即获取或接收数据并将数据转换为字符/从字符转换。在某些情况下,您可以通过提供编码告诉 class 如何执行转换步骤。
相比之下,InputStream
或 OutputStream
是字节的源或汇,通常 1 不进行任何字符转换。
在 Files.readAllBytes
的情况下,该方法是从文件中读取所有字节并将它们放入字节数组中。它不需要 Charset
参数,因为它不是为进行任何解码而设计的。
另一方面,Files.readAllLines
确实需要 Charset
。这是因为它将文件内容作为代表文件 行 的 String
对象数组传递。在将字节转换为 Java String
时,您需要说明字节表示的文本/字符是如何编码的。
1 - 假设它可以......但你会看到 Java 不提供 class 像 ReaderInputStream
或 WriterOutputStream
.几乎不需要它们。