Есть ли в Apache FileUtils способ учета спецификаций при добавлении в файл UTF-16?
У меня есть большой набор данных, который содержит испанские и английские символы, которые я буферизирую и передаю в файл. Первое нажатие делает отлично и записывает новый файл спецификации UTF-16BE \w.
Когда я пытаюсь добавить следующий набор данных, FileUtils.write() вызывает String.getBytes("UTF-16"), которая создает другую спецификацию в начале байтового массива, который он собирается добавить.
Есть ли способ сообщить FileUtils, чтобы он определял, добавляется ли он, и урезать спецификацию, если она существует?
2 ответа
Хорошо, я думаю, что понял, что я хочу сделать.
private byte[] withoutBOM(final String string, final Charset encoding) throws UnsupportedEncodingException {
byte[] bytes = string.getBytes(encoding);
return Arrays.copyOfRange(bytes, bytes.length % string.length(), bytes.length);
}
Это будет предполагать, что любые кодировки будут четным кратным строки (например, UTF-16 имеет два байта для каждого символа) и обрезает любые метаданные с начала массива байтов. Таким образом, я могу просто вызывать этот метод, не зная, какая на самом деле кодировка, каждый раз, когда я обнаруживаю, что добавляю в файл
В Java по умолчанию кодировка "UTF-16" всегда добавляет спецификацию в начале. Однако два варианта "UTF-16BE" и "UTF-16LE" не записывают спецификацию:
Из документации Charset (см. Раздел "при кодировании"):
При декодировании кодовые наборы UTF-16BE и UTF-16LE интерпретируют начальные метки порядка байтов как неразрывный пробел с нулевой шириной; при кодировании они не пишут метки порядка байтов.
При декодировании кодировка UTF-16 интерпретирует метку порядка байтов в начале входного потока, чтобы указать порядок байтов потока, но по умолчанию принимает значение big-endian, если метка порядка байтов отсутствует; при кодировании он использует порядок байтов с прямым порядком байтов и записывает метку порядка байтов с прямым порядком байтов.
Поэтому вам просто нужно проверить существующую спецификацию и выбрать подходящую кодировку для добавления текста UTF-16 в ваш файл.
Кстати: для текстов на английском и испанском языках будет достаточно UTF-8 и гораздо более эффективный...