InputStreamReader, FileInputStream начинает синтаксический анализ файла в середине, а не в начале - PullRequest
2 голосов
/ 17 февраля 2012

Я пытаюсь проанализировать файл JSON в кодировке UTF 16, однако натолкнулся на странную проблему.

Всякий раз, когда я использую FileInputStream, анализ файла, кажется, начинается в средней точке. Например, если файл имеет длину 40 символов, он начинается с символа 20. Это приводит к ошибкам при синтаксическом анализе JSON, поскольку очевидно, что его данные начинаются с символа 0 в файле.

Эта проблема возникла на днях, несмотря на то, что работала неделями. Я не вижу проблем с моим кодом, поскольку он не изменился за несколько дней до появления проблемы.

Одним из моих попыток обхода было переключиться на использование FileReader. Обычно он начинается с символа ноль, однако не может обрабатывать символы UTF-16 в документе, поэтому не решает проблему.

Я использую библиотеку Google Gson для обработки JSON, однако я думаю, что проблема лежит где-то внутри InputStreamReader или FileInputStream.

Ниже приведен код, который обсуждается;

JsonReader reader = new JsonReader(new InputStreamReader(new FileInputStream(file), "UTF-16"));
reader.beginArray();
...

Вот ошибка, которую он выдает. Строка reader.beginArray(); выше вызывает исключение.

java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 21
    at com.google.gson.stream.JsonReader.expect(JsonReader.java:337)
    at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:304)
    at reader.ProofDatabase.load(ProofDatabase.java:130)
    ...

А вот мой частичный обходной путь, который не обрабатывает строки UTF16

JsonReader reader = new JsonReader(new FileReader(file));
reader.beginArray();
...

Любое решение, будь то исправление исходной проблемы или другой способ чтения файла, поскольку UTF-16 будет более чем приветствоваться.

1 Ответ

0 голосов
/ 17 апреля 2012

Забыл обновить вопрос, когда нашел решение.

Ошибка произошла из-за того, что я вручную создал файл JSON, а не программно его генерировал.

Когда файл был сгенерирован классом JSONWriter, в файл были добавлены дополнительные метаданные, которые сообщали парсеру, что это файл JSON. Эти метаданные отсутствовали в созданном вручную файле, поэтому JSONReader выдавал ошибки при разборе файла.

...