Java String содержит посторонние данные - PullRequest
3 голосов
/ 09 февраля 2011

У меня есть вход в кодировке UTF16LE. К тому времени, когда этот ввод достигает моего кода, он проходит через FileInputStream, заключенный в FileReader, заключенный в LineNumberReader.

Первая прочитанная строка дает строку вроде:

"1 piece of data like a string"

Однако, глядя на эту строку, значение будет примерно таким:

[, 1, p, i, ...]

Обратите внимание на пустой элемент для запуска.

Нет, эта строка не передается через пару функций тут и там, конвертируется в Object и в основном проходит через ее шаги. В определенный момент то, что должно быть только первой частью строки (1 или, в моем случае, любое число, включая десятичные дроби), передается функции, которая должна проанализировать ее для фактического числа.

Содержимое этой строки выглядит как "1", но в значении, которое оно говорит:

[, 1, p, i, ...]

так что вся строка все еще там.

В любом случае он возвращает ParseException, и я печатаю непарсируемый номер в сообщениях об исключении, и моя регистрация сообщает мне, что «1» - это непарсированный номер.

Настоящая проблема - это ведущий пустой элемент, поскольку последующие строки демонстрируют аналогичное поведение, за исключением ведущего пустого элемента, и они анализируют.

Ответы [ 2 ]

2 голосов
/ 09 февраля 2011

A String (по крайней мере, реализация в OpenJDK) хранит char[], смещение и счетчик.Фактическим содержимым String являются символы в char[] с индексами offset до offset+count.

Это означает, что char[] может содержать больше символов, чем Stringна самом деле представляет.

Это сделано для того, чтобы иметь возможность совместно использовать char[] s между различными String экземплярами.

Например, если у вас есть String со значением foobar и вы назовете .substring(3) для него, тогда результирующий String будет представлять bar, но на самом деле они могут ссылаться на тот же char[].Второй String будет просто иметь offset, что на 3 больше, чем оригиналы String, и count, что на 3 меньше.

Все это работает только потому, что String объекты действительно неизменны:поскольку ни один String никогда не изменит его char[], для них совершенно безопасно поделиться им.

Это означает, что проверка объекта String в отладчике может создать ложное впечатление.Поэтому, если вы хотите проверить String символ за символом, самое безопасное - это вызвать toCharArray() или charAt() в цикле.

0 голосов
/ 09 февраля 2011

Я думаю, что у меня есть ответ.Кодировка не была UTF16LE.Он был установлен в UTF16LE с помощью алгоритма автоматического обнаружения символов.Кодировка utf16 с спецификацией.Однако, поскольку различные классы считали кодировку UTF16LE, они не избавились от спецификации, которой не должно быть в версии LE.

...