hadoop hdfs xml解析出错: Invalid UTF-8 middle byte 0x7b

  1. 用将xml文件上传到hdfs中,上传前使用stax的方式进行解析过,没问题。结果从hdfs中以inputstream的方式在本地再次使用stax解析,结果出错。
  2. 上传代码
//已追加方式上传到hdfs中
//记录文件的其实位置
fileInfo.setOffset(writeFs.getFileStatus(curPath).getLen());

FileSystem writeFs = FileSystem.get(configuration);
OutputStream out = writeFs.append(curPath);
//以字节方式拷贝到hdfs上
IOUtils.copyBytes(new FileInputStream(file), out, 4096, true);

//记录文件的长度
fileInfo.setSize((int) (writeFs.getFileStatus(curPath).getLen() - fileInfo.getOffset()));

在hdfs获得的inputstream的代码


FSDataInputStream in = FileSystem.get(configuration).open(curPath));
in.seek(offset);//跳转到文件的起始位置

stax解析代码

public abstract class StaxHandler<T> {
    private XMLEventReader xmlEventReader;

    private boolean stop = false;
    private String firstElement = null;

    protected String nextData() throws XMLStreamException {
        XMLEvent event = xmlEventReader.nextEvent();
        if (event.isCharacters()) {
            return event.asCharacters().getData();
        } else if (event.isEndElement() && event.asEndElement().getName().getLocalPart().equals(firstElement)) {
            stop = true;
        }
        return "";
    }

    protected boolean hasNext() {
        return !stop && xmlEventReader.hasNext();
    }

    protected XMLEvent nextEvent() throws XMLStreamException {
        XMLEvent event = xmlEventReader.nextEvent();
        if (event.isStartElement() && Objects.isNull(firstElement)) {
            // 记录xml的根元素,后面EndElement中是根元素就停止读取
            firstElement = event.asStartElement().getName().getLocalPart();
        } else if (event.isEndElement() && event.asEndElement().getName().getLocalPart().equals(firstElement)) {
            stop = true;
        }
        return event;
    }

    public void setXmlEventReader(XMLEventReader xmlEventReader) {
        this.xmlEventReader = xmlEventReader;
    }

    abstract public void parse() throws XMLStreamException;

    abstract public T getResult();
}
  1. 报错截图

clipboard.png
结果在解析过程中出错了

  1. 尝试

上传前解析过没有问题,上传后在从hdfs中以inputstream读取解析有问题。所以先读取保存到本地之后,在对保存后的文件进行解析,这个也没有问题。
保存到本地代码

FSDataInputStream in = FileSystem.get(configuration).open(curPath));
in.seek(offset);//跳转到文件的起始位置
IOUtils.copyBytes(in, new FileOutputStream("123.xml"), fileLength, true);
//在对123.xml以stax方式进行解析,结果对着。

网上也没找到有用的信息,不知道是啥问题,特此请教。

阅读 3k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题