PipedInputStream で, Object 読込みのサンプル

前回、ObjectOutputStream 出力→PipedOutputStream だったので、
今度は、PipedInputStream → ObjectInputStream
これも、Android 使う場面があるかどうか、、、おそらく使わない。

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
/**
 * ObjectInputProcessor.  Object input Processor
 */

public abstract class ObjectInputProcessor<T>{
   /**
    * Input progress
    * @param size 1~1024
    * @param count stream読込み回数
    * @param total 読込みサイズ累積値
    */

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

   /**
    * 読込結果ハンドラ
    * @param t T
    */

   protected abstract void postResult(T t);

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

   protected abstract void onFailedStream(String errmsg);

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

   protected abstract void onFailedHandler(String errmsg);

   /**
    * 実行
    * @param stream InputStream
    */

   @SuppressWarnings("unchecked")
   public void execute(final InputStream stream){
      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{
               byte[] buffer = new byte[1024];
               int len;
               int count = 0;
               int total = 0;
               while*1 > 0){
                  po.write(buffer, 0, len);
                  po.flush();

                  count++;
                  total += len;
                  progress(len, count, total);
               }
            }catch(Exception e){
               onFailedHandler(e.getMessage());
            }
         }
      }).start();
      try{
      ObjectInputStream in = new ObjectInputStream(pin);
      postResult*2;
      in.close();
      pin.close();
      po.close();

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

テストサンプル

new ObjectInputProcessor<List<String>>(){
   @Override
   protected void progress(int size,int count,int total){
      System.out.println("# count : "+count+"  "+size+"  "+total);
   }
   @Override
   protected void postResult(List<String> list){
      for(String s:list){
         System.out.println(s);
      }
   }
   @Override
   protected void onFailedStream(String errmsg){
      System.out.println(errmsg);
   }
   @Override
   protected void onFailedHandler(String errmsg){
      System.out.println(errmsg);
   }
}.execute(new FileInputStream(n


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

*2:T)in.readObject(