Запись в файл с определенной кодировкой в ​​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 (есть ли альтернатива, в которой вы можете перейти к позиции символа?)


person MrJalapeno    schedule 01.09.2016    source источник
comment
Вы можете использовать FileOutputStream?   -  person Shankar Shastri    schedule 01.09.2016
comment
Если прочитанный вами байт имеет значение меньше 128, то это первый байт в символе UTF-8. Значение байта 128-255 является серединой последовательности. Вы можете искать случайным образом, а затем найти следующий байт со значением 0-127.   -  person Phylogenesis    schedule 01.09.2016
comment
Вы можете использовать FileOutputStream. stackoverflow .com/questions/1001540/   -  person Shankar Shastri    schedule 01.09.2016


Ответы (1)


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

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

Re

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

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

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

Хотя бы кодировку укажите:

Files.newBufferedWriter(file.toPath(), "ISO-8859-15");
person Joop Eggen    schedule 01.09.2016
comment
Большое спасибо за ваш ответ. Хотя вот вопрос. Если я использую хорошо установленную UTF-8, как мне решить поиск по файлу? (прямо сейчас я могу перейти к определенной позиции байта с помощью RandomAccessFile.seek(long pos) - person MrJalapeno; 01.09.2016
comment
Можно использовать ByteBuffer с отображением памяти, просмотреть его для точных позиций файла с помощью Charset.Decoder и проиндексировать эти позиции. Поэтому используйте FileChannel с r (режим только для чтения) для индексации, это относительно быстро. Начните с примера кода. - person Joop Eggen; 01.09.2016