RandomAccessFile метод writechar записывает NUL в файл и writeUTF записывает ENQ , как избавиться от них?

В java.io.RandomAccessFile, когда метод writeChar() используется для записи массива символов в цикле в текстовый файл как

RandomAccessFile txtfile = new RandomAccessFile("Hello.txt","rw");
char c[] = {'S','i','g','n','e','d'};
for(char k:c) txtfile.writeChar(k);

Выдает результат в Hello.txt, как при открытии в обычном блокноте

 S i g n e d 

Но при открытии в текстовом редакторе NotePad++ файл Hello.txt отображается как

 [NUL]S[NUL]i[NUL]g[NUL]n[NUL]e[NUL]d  

И когда я использовал метод writeUTF() для записи строки в Hello.txt как

txtfile.writeUTF("hello");

Он дал результат в виде пустого места впереди, а при открытии в NotePad ++ он отображается как

[ENQ]hello

Как я могу написать или добавить обычную строку в файл без пробелов (например, [NUL] или [ENQ]), как в этом случае?

Пожалуйста, напишите ответ, как записать любую строку в файл в RandomAccessFile на Java!

Заранее спасибо !

Какую кодировку файлов вы хотите использовать? То, что вы описываете, является желаемым поведением, если UTF-16 используется в качестве кодировки файла.

Xaver 20.12.2020 19:39

Да, я понял, я пытался записать байт UTF-8 в формате UTF-16! поэтому перед каждым написанным символом ставится NUL!

Mahanth_Maha 21.12.2020 17:53
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Управление транзакциями JDBC - это мощная функция, которая позволяет рассматривать группу операций с базой данных как единую единицу работы. Оно...
Выполнение HTTP-запроса с помощью Spring WebClient: GET
Выполнение HTTP-запроса с помощью Spring WebClient: GET
WebClient - это реактивный веб-клиент, представленный в Spring 5. Это реактивное, неблокирующее решение, работающее по протоколу HTTP/1.1.
Gradle за прокси-сервером
Gradle за прокси-сервером
Создайте проект Gradle под сетевым прокси.
0
2
368
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Значение char в Java составляет два байта. RandomAccessFile предназначен для чтения и записи двоичных данных. Он не выполняет никаких преобразований текста. При запросе на запись символа он просто записывает представление этого символа в памяти на диск.

Посмотрите документацию для класса RandomAccessFile:

writeChar(целое v) Записывает char в файл как двухбайтовое значение, старшим байтом вперед.
запись байта (целое v) Записывает байт в файл как однобайтовое значение.
writeBytes (строка с) Записывает строку в файл в виде последовательности байтов.

Поэтому используйте writeByte вместо writeChar, чтобы записать символ в файл в виде одного байта ASCII, с которым все редакторы должны работать одинаково. Чтобы записать строку в файл в виде однобайтовых символов за один вызов, используйте метод writeBytes, который принимает строку и записывает ее в файл в виде однобайтовых символов.

Если вы хотите только записать текст в файл, лучше использовать для этого класс FileWriter или OutputStreamWriter. Эти классы пишут текст с учетом кодировки символов. Первый предполагает кодировку символов по умолчанию. Последний позволяет указать кодировку символов, которую вы хотите использовать для преобразования текста в байты перед записью в файл.

Другие вопросы по теме