3

- XMLStreamReader>Location 有一个名为getCharacterOffset().

不幸的是,Javadocs 指出这是一个命名模糊的方法:它还可以返回一个字节偏移量(这在实践中似乎是正确的);从文件读取时(例如)似乎会发生这种情况:

Javadoc指出:

将字节或字符偏移量返回到此位置指向的输入源中。如果输入源是文件或字节流,则这是该流中的字节偏移量,但如果输入源是字符媒体,则偏移量是字符偏移量。(重点补充)

我真的需要字符偏移;而且我很确定我得到的是字节偏移量。

(UTF-8 编码的)XML 包含在(部分损坏的 1G)文件中。[因此需要使用较低级别的 API,它不会抱怨缺乏良好的格式,直到它真的别无选择,只能]。

问题

Javadoc 说“...输入源是字符媒体...”是什么意思:我如何强制它将我的输入文件视为“字符媒体” - 以便我获得准确的(字符)偏移量而不是字节偏移?

额外的废话:

[我很确定这是怎么回事-当我将文件分开时(使用某些已知的高级标签),我丢失了一些字符或多余的字符-以非累积的方式-我将差异减少到几个多字节字符抛出计数器:也是当我复制时(例如在 Powershell 中使用'head'/'tail' - 这个工具似乎可以正确识别[或假设 UTF-8] 并且可以很好地转换为据我所知,UTF-16]

4

2 回答 2

3

偏移量以底层证券为单位Source

XMLStreamReader唯一知道它从 中读取了多少单位,所以Source偏移量是在这些单位中计算的。

AStream以单位为单位工作byte,因此您最终会得到一个byte偏移量。

AReader以 为单位工作char,因此您最终得到char.

文档StreamSource在“字符媒体”一词的含义上更加明确。

也许尝试类似的东西

final Source source = new StreamSource(new InputStreamReader(new FileInputStream(new File("my.xml")), "UTF-8"));
final XMLStreamReader xmlReader = XMLInputFactory.newFactory().createXMLStreamReader(source);
于 2013-04-12T14:49:50.993 回答
1

XMLInputFactory.createXMLStreamReader(java.io.InputStream)是一个字节流

XMLInputFactory.createXMLStreamReader(java.io.Reader)是一个字符流

于 2013-04-12T14:52:38.913 回答