Почему java nio может писать только байты? - PullRequest
0 голосов
/ 12 ноября 2018

Правда ли, что java nio может писать только байты? Например:

    Path path=FileSystems.getDefault().getPath("\(a path)")
    Files.write(path, "test string".getBytes())

Я не могу передать только строку второму параметру Files.write. Если это так, то почему могут быть записаны только байты?

1 Ответ

0 голосов
/ 12 ноября 2018

Другой метод, Files.write(Path,Iterable,Charset,OpenOption...), может использоваться для записи CharSequence s напрямую (a String - это CharSequence).

Запись строк текста в файл. Каждая строка представляет собой последовательность символов и записывается в файл последовательно, каждая строка заканчивается разделителем строк платформы, как определено системным свойством line.separator. Символы кодируются в байты с использованием указанной кодировки.

Параметр options указывает, как файл создается или открывается. Если параметры отсутствуют, этот метод работает так, как если бы присутствовали параметры CREATE, TRUNCATE_EXISTING и WRITE. Другими словами, он открывает файл для записи, создает файл, если он не существует, или сначала усекает существующий обычный файл до размера 0. Этот метод гарантирует, что файл будет закрыт, когда все строки были записаны (или выдается ошибка ввода-вывода или другое исключение времени выполнения). Если возникает ошибка ввода-вывода, это может произойти после того, как файл был создан или усечен, или после того, как в файл были записаны некоторые байты.

Java 8 добавила перегрузку, которая не требует Charset и использует UTF-8 по умолчанию.

Java 11 добавил еще один метод: Files.writeString(Path,CharSequence,Charset,OpenOption...).

Записать CharSequence в файл. Символы кодируются в байты с использованием указанной кодировки.

Все символы пишутся как есть, включая разделители строк в последовательности символов. Дополнительные символы не добавляются.

Параметр options указывает, как файл создается или открывается. Если параметры отсутствуют, этот метод работает так, как если бы присутствовали параметры CREATE, TRUNCATE_EXISTING и WRITE. Другими словами, он открывает файл для записи, создает файл, если он не существует, или сначала усекает существующий обычный файл до размера 0.

Этот метод также имеет перегрузку, которая не требует Charset, с использованием UTF-8 в качестве значения по умолчанию снова.

Однако под капотом CharSequence преобразуются в байты, как это упоминает Scary Wombat и yshavit в комментариях к вопросу. Документация этих методов даже делает это явным:

Символы кодируются в байты с использованием указанной кодировки.

...