Java SAX解析器是否将所有数据保存在内存中?

Java SAX解析器是否将所有数据保存在内存中?,java,sax,Java,Sax,我正在处理一个需求,需要拆分大XML并进一步处理 这是XML示例,它可以分为一行 <?xml version="1.0"?><company><staff><firstname>yong</firstname><firstname>jin</firstname></staff></company> 我的第一个疑问是,SAXParser读取字节是否明智 第二,我希望我的输出是这样的 <

我正在处理一个需求,需要拆分大XML并进一步处理

这是XML示例,它可以分为一行

<?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>