Запись в файл с определенной кодировкой в ​​Java

Это может быть связано с моим предыдущим вопросом (о том, как конвертировать "för" в "för")

Итак, у меня есть файл, который я создаю в своем коде. Прямо сейчас я создаю это следующим кодом:

FileWriter fwOne = new FileWriter(wordIndexPath);
BufferedWriter wordIndex = new BufferedWriter(fwOne);

затем несколько

wordIndex.write(wordBuilder.toString()); //that's a StringBuilder

окончание (после цикла while)

wordIndex.close();

Теперь проблема в том, что этот файл огромен, и я хочу (нужно) прыгнуть в него, не просматривая весь файл. seek(long pos) метод RandomAccessFile Позвольте мне сделать это.

Вот моя проблема: кажется, что символы в файле, который я создал, кодируются с помощью UTF-8, и единственная информация, которую я получаю, когда ищу, - это позиция символа, к которой я хочу перейти. seek(long pos) с другой стороны, скачки в байтах, так что я не попал в нужное место, так как символ UTF-8 может быть больше одного байта.

Вот мой вопрос: могу ли я, когда я пишу файл, записать его вместо ISO-8859-15 (где символ является байтом)? Таким образом, seek(long pos) поставит меня в нужное положение. Или я должен вместо этого попытаться использовать альтернативу RandomAccessFile (есть ли альтернатива, где вы можете перейти к позиции персонажа?)

1 ответ

Решение

Теперь сначала беспокойство. FileWriter и FileReader - это старые служебные классы, которые используют настройки платформы по умолчанию на этом компьютере. Запустите в другом месте этот код даст другой файл, не сможет прочитать файл из другого места.

ISO-8859-15 является однобайтовой кодировкой. Но java содержит текст в Unicode, поэтому он может комбинировать все сценарии. А также char это UTF-16. Как правило, индекс char не будет байтовым индексом, но в вашем случае он, вероятно, работает. Но разрыв строки может быть одним \n или два \r\n chars/bytes - зависит от платформы.

ре

Лично я думаю, что UTF-8 хорошо зарекомендовал себя, и его проще использовать:

byte[] bytes = string.getBytes(StandardCharsets.UTF_8);
string = new String(bytes, StandardCharsets.UTF_8);

Таким образом, все специальные предложения, евро и т. Д. Всегда будут доступны.

Как минимум укажите кодировку:

Files.newBufferedWriter(file.toPath(), "ISO-8859-15");
Другие вопросы по тегам