Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android sax解析器不完整的字符数组_Java_Android_Saxparser - Fatal编程技术网

Java android sax解析器不完整的字符数组

Java android sax解析器不完整的字符数组,java,android,saxparser,Java,Android,Saxparser,我找到了一些与这个问题相关的帖子,但没有找到解决方案。问题是,在character()函数上,ch[]数组包含上次调用的不完整或最后一个元素,这种情况有时会发生,但98%的情况下工作正常。文件名没有特殊字符,也没有奇怪的名称 如果有, <tag>image1test.jpg<tag> <tag>image2bla.jpg<tag> 解析器不需要在处理程序上只调用一次字符(char[],int,int)。您必须期待多个调用,并且仅在调用endEl

我找到了一些与这个问题相关的帖子,但没有找到解决方案。问题是,在character()函数上,ch[]数组包含上次调用的不完整或最后一个元素,这种情况有时会发生,但98%的情况下工作正常。文件名没有特殊字符,也没有奇怪的名称

如果有,

<tag>image1test.jpg<tag> 
<tag>image2bla.jpg<tag>

解析器不需要在处理程序上只调用一次
字符(char[],int,int)
。您必须期待多个调用,并且仅在调用
endElement()
方法后处理该值

public class Handler extends DefaultHandler {

    private StringBuilder sb = new StringBuilder();
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        sb.append(ch, start, length);

    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        doStuffWith(sb.toString());
        sb = new StringBuilder();
    }
}

我不知道Android环境中是否有StringBuilder。我的样品来自香草爪哇。您可能不会选择完全这样做,但它说明了解析器如何随时调用
characters()
,您必须做好准备。是的,Android中有一个stringBuilder。我会尽力通知你的。感谢您没有解决方案,因为字符串的组成正确,问题来自已经包含剩余字符的ch[]。所以,如果ch[]包含错误的字符串,则不介意以后如何编写字符串。在你的真实代码中,你确定你尊重被调用的“长度”吗?如果您使用
start=0 len=6
获得
[i,m,a,g,e,2,b,e,s,t]
,然后使用
start=0和len=6
获得
[l,a,j,p,g,b,e,s,t]
,这一切都很好,因为您永远不应该读取最后4个字符。当然,问题是某些字符有剩余信息或字符数组未完成。从“image2bla.jpg”我们可以得到“image2”或“image2tes”。所以字符数组被破坏了。这种情况每100次发生一次!
public class Handler extends DefaultHandler {

    private StringBuilder sb = new StringBuilder();
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        sb.append(ch, start, length);

    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        doStuffWith(sb.toString());
        sb = new StringBuilder();
    }
}