Почему Files.readAllBytes () не принимает параметр кодировки? - PullRequest
2 голосов
/ 28 мая 2020

Не уверен, что понимаю это правильно, но я подумал, что когда мне нужно сохранить содержимое файла в виде массива байтов в Java, мне нужно предоставить Java кодировку файла.

Если я хочу сделать это, например, с готовым, мне нужно сделать что-то вроде:

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

Почему я не могу указать кодировку файла при использовании Files.readAllBytes(myFilePath)? Я хотел бы сделать что-то вроде Files.readAllBytes(myFilePath, StandardCharsets.ISO_8859_1).

Я ошибаюсь?

Ответы [ 2 ]

5 голосов
/ 28 мая 2020

Да, вы скорее ошибаетесь. Но легко ошибиться ... если вы не понимаете способ моделирования текстовых данных Java.

Вы объединяете функции Reader / Writer с функциями InputStream / OutputStream.

  • Первые позволяют вам потреблять (читать) и создавать (писать) символы; т.е. текстовые данные, представленные с использованием кодовых точек Unicode.
  • Последние позволяют вам потреблять (читать) и производить (писать) байты; т.е. двоичные или двоичные данные.

Теперь классы многие Reader и Writer фактически выполняют две функции одновременно; то есть получение или прием данных И преобразование данных в / из символов. В некоторых случаях вы можете указать классу, как выполнить этап преобразования, указав кодировку.

Напротив, InputStream или OutputStream является источником или приемником байтов, и обычно 1 не переводит символы.

В случае Files.readAllBytes метод считывает все байты из файла и помещает их в массив байтов. Он не принимает параметр Charset, потому что он не предназначен для какого-либо декодирования.

С другой стороны, Files.readAllLines принимает Charset. Это потому, что он доставляет содержимое файла в виде массива String объектов, представляющих строк файла. Чтобы при преобразовании байтов в Java String вам нужно сказать, как кодируются текст / символы, представленные байтами.


1 - Гипотетически это могло бы ... но вы увидит, что Java не предоставляет такие классы, как ReaderInputStream или WriterOutputStream. В них нет необходимости.

2 голосов
/ 28 мая 2020

Нет, вам нужен только Charset, если вы хотите представить байты как String (т.е. как текст), потому что , означающее байтов, зависит от кодировки.

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

Однобайтовый массив может представлять несколько разных строк в зависимости от кодировки, а байты в массиве не зависят от кодировки, поэтому нет смысла передавать кодировку в качестве аргумента этой функции.

...