2013-04-12 3 views
3

XMLStreamReader -> 위치에 getCharacterOffset()이라는 메서드가 있습니다.XMLStreamReader : 파일 오프셋 가져 오기 : XML

불행히도 Javadocs는 이것이 모호한 이름의 메소드라는 것을 나타냅니다. 바이트 오프셋을 반환 할 수도 있습니다 (실제로는 사실 인 것처럼 보입니다).

Javadoc 상태 :

반환이 위치가 가리키는 입력 소스에의 오프셋 (offset) 바이트 또는 문자를 unhelpfully이 파일에서 (예를 들어) 읽을 때 발생하는 것 같습니다. 입력 소스가 파일 또는 바이트 인 경우 스트림이이 스트림에 대한 바이트 오프셋이지만 입력 소스가 문자 미디어이면 오프셋은 문자 오프셋입니다. (강조 추가)

나는 실제로 문자 오프셋이 필요합니다; 그리고 저는 대체로 바이트 오프셋이 주어진다고 확신합니다.

(UTF-8로 인코딩 된) XML은 (부분적으로 손상된 1G) 파일에 포함되어 있습니다. [그러므로 실제로는 선택의 여지가 없어 질 때까지 잘 형성되지 않은 것에 대해 불평하지 않는 하위 수준의 API를 사용할 필요가 있습니다.]

질문이 말할 때

는 자바 독은 무엇을 의미 하는가은 '... 입력 소스는 문자 매체입니다 ...'나는 '문자 매체'로 내 입력 파일의 생각을 강제 할 수있는 방법 - 바이트 오프셋보다는 정확한 (문자) 오프셋을 얻을 수 있도록?

추가 ㅋ ㅋ ㅋ ㅋ :

가 [나는이 벌어지고있는 것입니다 확신 해요 - 내가 따로 파일을 제거 때 누락 또는 추가 몇 가지 문자를 얻을 (특정 알려진 높은 수준의 태그를 사용) - 비 누적 방식으로 - 나는 카운터를 던지면서 몇 가지 멀티 바이트 문자로 차이를 둡니다 : 또한 복사 할 때 (Powershell에서 'head'/ 'tail'을 사용하여 -이 도구가 올바르게 나타납니다 [UTF-8을 인식하거나 UTF-16으로 잘 변환]

답변

3

오프셋은 기본 단위 인 Source.

0 단위입니다.

XMLStreamReaderSource에서 읽은 단위의 수만 알고 있으므로 해당 단위로 오프셋이 계산됩니다.

Streambyte 단위로 작동하므로 오프셋이 byte으로 끝납니다.

Readerchar 단위로 작동하므로 오프셋이 이됩니다.

StreamSource에 대한 문서는 "문자 미디어"가 의미하는 바를 더욱 명확하게 나타냅니다.바이트 스트림 (XMLInputFactory.newInstance()와 함께 작업 할 때

어쩌면

final Source source = new StreamSource(new InputStreamReader(new FileInputStream(new File("my.xml")), "UTF-8")); 
final XMLStreamReader xmlReader = XMLInputFactory.newFactory().createXMLStreamReader(source); 
1

XMLInputFactory.createXMLStreamReader(java.io.InputStream) 같은 것을 시도하는 것은 문자 스트림

+0

바이트 스트림

XMLInputFactory.createXMLStreamReader(java.io.Reader)이다. createXMLEventReader (새 FileInputStream에 (...))), getCharacterOffset()의 반환 유형은 int이지만, 파일 (바이트)은 File.length()에 따라 긴 크기의 파일이 될 수 있습니다. –