PipedOutputStream で Object 出力のサンプル

Android で使用することを意識して、
ObjectOutputStream 出力を、PipedOutputStream に書く込むものを
作ってみたが、本当に使う場面があるかどうか。。。

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
/**
 * ObjectOutputProcessor.  Object output Processor
 */

public abstract class ObjectOutputProcessor{
   /**
    * Output progress
    * @param size 1~1024
    * @param count stream書込み回数
    * @param total 書込みサイズ累積値
    */

   protected abstract void progress(int size, int count, int total);

   /**
    * stream IO Error
    * @param errmsg エラーメッセージ
    */

   protected abstract void onFailedStream(String errmsg);

   /**
    * Inner IO Error
    * @param errmsg エラーメッセージ
    */
   protected abstract void onFailedHandler(String errmsg);

   /**
    * 実行
    * @param object 出力Object
    * @param outstream 出力先 OutputStream
    */

   public final void execute(final Object object,OutputStream outstream){
      final PipedOutputStream po = new PipedOutputStream();
      PipedInputStream pin = new PipedInputStream();

      try{
      pin.connect(po);
      }catch(IOException e){
         throw new RuntimeException(e);
      }
      new Thread(new Runnable(){
         @Override
         public void run(){
            try{
            ObjectOutputStream out = new ObjectOutputStream(po);
            out.writeObject(object);
            out.flush();
            out.close();
            }catch(Exception e){
               onFailedHandler(e.getMessage());
            }
         }
      }).start();
      try{
         byte[] buffer = new byte[1024];
         int len;
         int count = 0;
         int total = 0;
         while*1 > 0){
            outstream.write(buffer, 0, len);
            outstream.flush();
            count++;
            total += len;
            progress(len, count, total);
         }
         pin.close();
         po.close();

         outstream.close();
      }catch(Exception e){
         onFailedStream(e.getMessage());
      }
   }
}

テストサンプル

final List<String> list = new ArrayList<String>();
for(int i=0;i <= 1200;i++){
   list.add(Integer.toString(i));
}
//
new ObjectOutputProcessor(){
   @Override
   protected void progress(int size,int count,int total){
      System.out.println("# count : "+count+"  "+size+"  "+total);
   }
   @Override
   protected void onFailedStream(String errmsg){
      System.out.println(errmsg);
   }
   @Override
   protected void onFailedHandler(String errmsg){
      System.out.println(errmsg);
   }
}.execute(list,new FileOutputStream(new File("data")));

//--------------- 検証 -------------------------------
ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File("data")));
@SuppressWarnings("unchecked")
List<String> list2 = (List<String>)in.readObject();
for(String s:list2){
System.out.println(s);

*1:len=pin.read(buffer, 0, buffer.length