前回、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