java – 为什么SAXParser在抛出事件之前读取了这么多?
场景:我通过极慢的网络收到一个巨大的xml文件,所以我想尽早开始过度处理.因此,我决定使用SAXParser. 我希望在标签完成后我会得到一个事件. 以下测试显示了我的意思:
我将输入流包装起来以查看读取的内容以及事件发生的时间. 我的期望是这样的:
可悲的是结果如下:
我的错误在哪里,我怎样才能得到预期的结果? 编辑: >首先,他正在尝试检测doc版本,这会导致扫描所有内容.随着doc版本,他介于两者之间(但不是我期望的) > public static final int DEFAULT_BUFFER_SIZE = 8192; 最佳答案
看来你对I / O的工作原理做了错误的假设.与大多数软件一样,XML解析器将以块的形式请求数据,因为从流中请求单个字节是导致性能灾难的方法.
这并不意味着在读取尝试返回之前必须完全填充缓冲区.只是,ByteArrayInputStream无法模拟网络InputStream的行为.您可以通过覆盖read(byte [],int,int)并且不返回完整的缓冲区来轻松修复它,例如,每个请求都有一个字节:
这将打印
显示,XML解析器如何适应InputStream中数据的可用性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |