-
push, stream-based, 事件驱动。代表SAX(JSR 5)
-
pull, stream-based,事件驱动。代表StAX, Jackson, opencsv
游标模式
输入
输出
StAX(JSR 173)
javax.xml.stream.XMLStreamReader
l 获取游标当前的数据:
int getEventType(), getXXX(), hasXXX(), isXXX()
l 移动游标:
public int next() throws XMLStreamException
public int nextTag() throws XMLStreamException
l 判断终止状态:
public boolean hasNext() throws XMLStreamException
l 状态常量:
javax.xml.stream.XMLStreamConstants
javax.xml.stream.XMLStreamWriter
l 移动游标:
wirteXXX()
Jackson
com.fasterxml.jackson.core.JsonParser
l 获取游标当前的数据:
getXXX()
l 移动游标:
nextXXX()
l 判断终止状态:
nextXXX() == null
l 状态常量:
com.fasterxml.jackson.core.JsonToken
com.fasterxml.jackson.core.JsonGenerator
l 移动游标:
wirteXXX()
JSON-P (JSR 353)
javax.json.stream.JsonParser
l 获取游标当前的数据:
getXXX()
l 移动游标:
public JsonParser.Event next()
l 判断终止状态:
public boolean hasNext()
l 状态常量:
javax.json.stream.JsonParser.Event
javax.json.stream.JsonGenerator
l 移动游标:
wirteXXX()
迭代器模式
输入
输出
StAX(JSR 173)
javax.xml.stream.XMLEventReader
l 迭代方法:
public XMLEvent nextEvent() throws XMLStreamException
public XMLEvent nextTag() throws XMLStreamException
l 判断终止状态:
public boolean hasNext()
l 迭代对象:
javax.xml.stream.events.XMLEvent
javax.xml.stream.XMLEventWriter
public void add(XMLEvent) throws XMLStreamException
opencsv
com.opencsv.CSVReader
l 迭代方法:
public String[] readNext() throws IOException
protected String getNextLine() throws IOException
l 判断终止状态:
readNext() == null
l 迭代对象:
String[]
com.opencsv.CSVWriter
public void writeNext(String[])
-
内存对象模型。代表DOM(JSR 5), JSON-P(JSR 353)
-
比较
内存对象模型模式灵活性高,可以对数据自由访问。代价是占用内存和CPU大。in memory模式适合小规模数据。
stream-based模式,对数据的输入、解析和输出是单向、串行且实时的,不需要对数据进行准确的预知。stream-based模式下,输入的数据被使用后会立即被丢弃,因此,stream-based模式占用内存和CPU小。代价是,在数据处理过程中的特定的时刻,只能看到一个局部的信息。
push模式的解析器,会将处理的数据发送(push)给客户端,不管客户端是否准备好使用这些数据,控制权在解析器。
pull模式的解析器,会等待客户端的调用,客户端只在需要的时候,通过调用解析器的方法来获取(pull)数据,控制权在客户端。