他所说的学习

今天去跑步前,同事问了我一个关于Java的问题——大概因为我是Java程序员。

我一看,MyCat丢出了一个异常堆栈。最上面类似于InitException,然后是 SAX.xxxxxxxx。我想我大概知道了,是XML文件出了问题。

定位到XML文件,果然是这样。

我想起我刚加入ZStack的时候,张鑫和我说过学习的三个境界:

  • 第一层:知道怎么用
  • 第二层:知道为什么用它?那么,你也肯定知道了同类(库、框架)的优缺点
  • 第三层:知道它的原理

以及一句他的座右铭:勿在浮砂筑高台。每学一样东西,就要学精,不然就是浪费自己的时间。

那时我正在fix一个global config的bug,他提醒了我,去了解一下XML解析技术。

其实XML解析技术的两大基类就是DOMSAX

  • DOM:Document Object Mode
  • SAX:Simple API for XML

DOM上衍生出JDOM和DOM4J,不过我们今天不关注这个。

如果写过Java的同学,肯定知道集合框架(就是List、Set等),这些类的设计思想有点像DOM。因为DOM要把XML的元素全部load到内存里,在内存里形成一个DOM树便于操作。

对应的,Java8引入了流的概念,即Stream。简单来说,集合与流之间的差异就在于什么时候进行计算。SAX也是如此,它就是一遍解析下去的——边扫描边解析。所以在需要的时候扫到相应的部分就行了。

这样的好处是在处理大文档的时候,DOM可能在加载的时候就要吃很多内存,并且还要组成一棵DOM树。

坏处则是SAX对于来回操作XML并不是很擅长(比如先操作100行的内容,然后第10行的内容),因为它每次都需要遍历。

那么MyCat为何使用SAX来扫描XML呢?那是因为XML中配置的是一些Bean的属性,在应用Starting时会把它们配置到实体类中,所以也就不需要DOM技术进行来回的操作了。

勿在浮砂筑高台。回头一想,关于学习,我还有很长的路要走啊。

你可能感兴趣的:(他所说的学习)