import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.OutputStream;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamWriter;

public class XMLStreamTestWriter implements Runnable
{
  OutputStream outputStream;

  public XMLStreamTestWriter(OutputStream out) {
    this.outputStream = out;
  }

  public void run() {
    try {
      XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
      XMLStreamWriter writer = outputFactory.createXMLStreamWriter(outputStream);
      writer.writeStartElement("foo");
      int i=1;
      while (i<100) {
        writer.writeStartElement("bla");
        writer.writeCharacters(" " + i);
        writer.writeEndElement();
        System.out.print("Write  <bla>" + i + "</bla> ");
        //writer.flush(); // if not uncommented: strictly alternating
        // comment out flush: sleep < 700 causes alternating after blocks of 2...5 elements
        try{ java.lang.Thread.sleep(50); }
          catch (Exception e) { e.printStackTrace(); }
        i++;
      }
      // writer.writeEndElement();  // close </foo> is done by the next line:
      writer.writeEndDocument(); // docu: closes all tags, but does not send anything else
      writer.flush();
      writer.close();
    } catch (Exception e) { e.printStackTrace(); }
    System.out.println("Writer finished");
  }

  public static void main(String[] args) throws Exception{
    PipedOutputStream pos = new PipedOutputStream();
    PipedInputStream pis = new PipedInputStream();
    pis.connect(pos);
    new Thread (new XMLStreamTestWriter(pos)).start();
    new Thread (new XMLStreamTestReader(pis)).start();
  }
}
