XMLStreamReader
- >位置有一个名为getCharacterOffset()
的方法。
不幸的是,Javadocs表明这是一个非常命名的方法:它也可以返回一个字节偏移量(这在实践中似乎是真的);没有用,这似乎是从文件中读取时(例如):
Javadoc州:
将字节或字符偏移量返回到输入源 位置指向。如果输入源是文件或字节 然后这是字节偏移到该流,但如果输入 source是字符媒体,然后偏移量是字符偏移量。 (重点补充)
我真的需要字符偏移量;而且我很确定我会被赋予字节偏移量。
(UTF-8编码)XML包含在(部分损坏的1G)文件中。 [因此需要使用一个较低级别的API,它不会抱怨缺乏良好的形式,直到它真的别无选择,直到]。
问题
当Javadoc说“输入源是一个角色媒体......”时,Javadoc是什么意思:我如何强迫它将我的输入文件视为“角色媒体” - 这样我才能得到准确的(字符)偏移而不是字节偏移?
额外等等等等。
[我很确定这是正在发生的事情 - 当我剥离文件时(使用某些已知的高级标签)我得到一些字符丢失或额外 - 以非准确的方式 - 我是将差异缩小到几个多字节字符抛出计数器:同样当我复制时(例如在Powershell中使用'head'/'tail' - 此工具似乎正确识别[或假设UTF-8]并执行据我所知,很好地转换为UTF-16]
答案 0 :(得分:3)
偏移量以基础Source
为单位。
XMLStreamReader
只知道它从Source
读取的单位数,因此偏移量以这些单位计算。
Stream
以byte
为单位工作,因此最终会产生byte
偏移量。
Reader
以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);
答案 1 :(得分:1)
XMLInputFactory.createXMLStreamReader(java.io.InputStream)
是一个字节流
XMLInputFactory.createXMLStreamReader(java.io.Reader)
是一个字符流