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