Using the RandomAccessSink

The RandomAccessSink is a Sink with the ability to add hooks. To demonstrate its usage we can have a look at a FML (FAQ Markup Language)-page. The simple structure of such a page can be like:

  <faq id="1">
    <question/>
    <answer/>
  </faq>
  <faq id="2">
    <question/>
    <answer/>
  </faq>

Such structure would be parsed to the following page:

faq["1"].question + link  
faq["2"].question + link  
faq["1"].question + anchor  
faq["1"].answer  
faq["2"].question + anchor  
faq["2"].answer  

With a Sink you can only append and there's no option to buffer. This would mean that you have to go twice over the structure: once for only the questions and once for the question + answer.

When using the RandomAccesSink we can prepare the structure of the page

  RandomAccessSink randomAccessSink = new RandomAccessSink(sinkFactory, outputStream, encoding);
  Sink questions  = randomAccessSink.addSinkHook();
  Sink qAndA      = randomAccessSink.addSinkHook();

Now you can append the first question to both sinks, and append the answer to the second one. The same can be done with the second faq-entry.