InputStreamReader,FileInputStream开始在中点解析文件而不是开始

时间:2012-02-17 15:56:53

标签: java inputstream gson fileinputstream inputstreamreader

我正在尝试解析UTF 16编码的JSON文件,但是我遇到了一个奇怪的问题。

每当我使用FileInputStream时,解析文件似乎从中点开始。例如,如果文件长度为40个字符,则它将从字符20开始。这会导致解析JSON时出错,显然它的数据从文件中的字符0开始。

这个问题前几天出现了,尽管工作了几个星期。我可以看到我的代码没有问题,因为它在问题开始前几天没有改变。

我尝试过的一种解决方法是切换到使用FileReader。它通常在字符零处开始,但它无法处理文档中的UTF-16字符,因此无法解决问题。

我正在使用Google的Gson库来处理JSON,但我认为问题出在InputStreamReaderFileInputStream的某个位置。

以下是有争议的代码;

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 :(得分:0)

忘记在找到解决方案时更新问题。

错误来自于我手动创建JSON文件而不是以编程方式生成它。

当文件由JSONWriter类生成时,额外的元数据被添加到文件中,该文件告诉解析器它是JSON文件。手动创建的文件中缺少此元数据,因此JSONReader在解析文件时抛出错误。