Java SAX解析器是否将所有数据保存在内存中?
我正在处理一个需求,需要拆分大XML并进一步处理 这是XML示例,它可以分为一行Java SAX解析器是否将所有数据保存在内存中?,java,sax,Java,Sax,我正在处理一个需求,需要拆分大XML并进一步处理 这是XML示例,它可以分为一行 <?xml version="1.0"?><company><staff><firstname>yong</firstname><firstname>jin</firstname></staff></company> 我的第一个疑问是,SAXParser读取字节是否明智 第二,我希望我的输出是这样的 <
<?xml version="1.0"?><company><staff><firstname>yong</firstname><firstname>jin</firstname></staff></company>
我的第一个疑问是,SAXParser读取字节是否明智
第二,我希望我的输出是这样的
<firstname>yong</firstname>
<firstname>jin</firstname>
永
晋
这件事我可以处理,但我想知道..当我得到
标记并进入字符
方法时,为什么要打印整个XML?它不应该只在第1行打印yong
而不是打印整个XML吗?这就是为什么我在想,SAXParser
是否将整个数据保存在内存中
有什么建议吗
谢谢
SAX解析器是否将所有数据保存在内存中
不,这才是重点。将XML文档的整个DOM数据加载到内存中,然后从中提取所需内容要比使用SAX繁琐的模型容易得多
但是SAX具有动态读取文档的好处,而无需将其完全加载到内存中
我的第一个疑问是,SAXParser读取字节是否明智
不是字节方式,不是。这将是非常低效的,特别是考虑到SAX的关键是对大量文档进行操作。这是一个缓冲读取。并不是说这会消耗很多内存
为什么要打印整个XML?它不应该只在第二行打印吗
1而不是打印整个XML?这就是我为什么要打印的原因
思考一下,SAXParser是否将整个数据保存在内存中
如上所述,出于合理的性能原因,SAX使用缓冲区进行读取。characters()方法的参数char[]大致就是前面提到的缓冲区
在您的示例中,您的文档很小,当然它将完全适合用于读取文档的真实缓冲区。
如果要处理更大的文档,您会注意到缓冲区包含数千个字符,但与整个文档不太接近
SAX解析器是否将所有数据保存在内存中
不,这才是重点。将XML文档的整个DOM数据加载到内存中,然后从中提取所需内容要比使用SAX繁琐的模型容易得多
但是SAX具有动态读取文档的好处,而无需将其完全加载到内存中
我的第一个疑问是,SAXParser读取字节是否明智
不是字节方式,不是。这将是非常低效的,特别是考虑到SAX的关键是对大量文档进行操作。这是一个缓冲读取。并不是说这会消耗很多内存
为什么要打印整个XML?它不应该只在第二行打印吗
1而不是打印整个XML?这就是我为什么要打印的原因
思考一下,SAXParser是否将整个数据保存在内存中
如上所述,出于合理的性能原因,SAX使用缓冲区进行读取。characters()方法的参数char[]大致就是前面提到的缓冲区
在您的示例中,您的文档很小,当然它将完全适合用于读取文档的真实缓冲区。
如果您要处理更大的文档,您会注意到缓冲区包含数千个字符,但距离整个文档还很远。因此,如果我的一行xml的大小为1+GB,则可能会失败……对吗。。。?因为我猜SAXParser会读取整行内容并放入内存,然后打电话检查标记…对吗?@Lenny no。。。它不读台词。它读取缓冲区。这取决于实现,但它读取,比如,1000个字节,然后将它们解码为字符,并将它们放入字符缓冲区。因此,如果我的一行xml的大小为1+GB,可能会失败…对吧。。。?因为我猜SAXParser会读取整行内容并放入内存,然后打电话检查标记…对吗?@Lenny no。。。它不读台词。它读取缓冲区。这取决于实现,但它读取1000个字节,然后将其解码为字符并将其放入字符缓冲区。
<firstname>yong</firstname>
<firstname>jin</firstname>