- PR -

オブジェクトの分割と結合

1
投稿者投稿内容
かい
常連さん
会議室デビュー日: 2003/05/27
投稿数: 34
投稿日時: 2004-06-09 16:50
お世話になっています。

オブジェクト(インスタンス)を指定するサイズで分割し、その後、
結合して、オブジェクトを生成したいと思っています。

オブジェクトの結合時に、次のExceptionが発生し、うまく結合
できません。
(ObjectInputStreamの行で発生しています)
<発生するException>
StreamCorruptedException: invalid stream header

対処方法をご存じの方がいましたら、アドバイスをお願いします。

public class DevideJoin {

public ArrayList devideData(Object obj, int devSize) throws IOException {

ArrayList list = new ArrayList() ;

/* byte出力用のストリームをOPEN */
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos) ;

/* 分割するオブジェクトを書き出す */
oos.writeObject(obj) ;

baos.flush() ;

/* バイト配列へコピー */
byte[] dataBuff = baos.toByteArray() ;

/* 分割するサイズ */
int buffSize= 0 ;

/* 分割するサイズを決定(配列サイズと分割指定サイズを比較) */
if (dataBuff.length < devSize){
buffSize = dataBuff.length ; /* 配列のサイズの方が小さい場合 -> 配列サイズ */
} else {
buffSize = devSize ; /* 配列のサイズの方が大きい場合 -> 分割指定サイズ */
}


/* 分割が終わるまでループ */
int offset = 0 ;
while(offset < dataBuff.length) {

byte[] saveBuff = new byte[buffSize] ;

System.arraycopy((Object)saveBuff, 0, (Object)dataBuff, offset, buffSize) ;

/* 分割後のデータをlistに追加 */
list.add( (Object)saveBuff ) ;

/* オフセットを設定 */
offset = offset + buffSize ;

/* 残りの読み込みサイズが、全体サイズを超える場合 */
if ((offset + devSize) > dataBuff.length) {
buffSize = dataBuff.length - offset ; /* 残りのサイズを指定 */
}

}

return list ;
}

public Object joinData(List list) throws IOException, ClassNotFoundException {

/* 分割前のサイズを取得 */
int i = 0 ;
int len = 0 ;
while(i < list.size()) {
byte[] tmp = (byte[])list.get(i) ;
len = len + tmp.length ;
i++ ;
}

/* ワーク用の配列にコピー */
i = 0 ;
byte[] data = new byte[len] ;
len = 0 ;
while(i < list.size()) {
byte[] tmp = (byte[])list.get(i) ;
System.arraycopy( data, len, tmp, 0, tmp.length ) ;
len = len + tmp.length ;
i++ ;
}

/* バイト入力用のストリームをOPEN */
ObjectInputStream ois =
new ObjectInputStream(new ByteArrayInputStream(data)) ; // <-- エラー

/* オブジェクトとして読み込む */
Object obj = ois.readObject() ;

return obj ;
}
}
ジュニア
会議室デビュー日: 2003/05/01
投稿数: 16
投稿日時: 2004-06-09 17:32
arraycopyの使い方が間違っています。
かい
常連さん
会議室デビュー日: 2003/05/27
投稿数: 34
投稿日時: 2004-06-09 17:38
回答ありがとうございます。

自分では、よく分からない状態なので、
もう少し、具体的に教えてもらえませんか?

お忙しいところ、申し訳ないのですが、よろしく
お願いします。
taro
ぬし
会議室デビュー日: 2003/10/20
投稿数: 316
投稿日時: 2004-06-09 17:56
もうお気付きの頃だと思いますが、転送元と転送先が逆ですよね。
System.arraycopy(転送元配列, 転送元配列の開始位置, 転送先配列, 転送先配列の開始位置, 要素数) ;
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/System.html#arraycopy(java.lang.Object, int, java.lang.Object, int, int)
# URL間違えました。

[ メッセージ編集済み 編集者: taro 編集日時 2004-06-09 17:58 ]
かい
常連さん
会議室デビュー日: 2003/05/27
投稿数: 34
投稿日時: 2004-06-09 18:16
ジュニアさん、taroさん、指摘ありがとうございます。

引数の順番を間違えていたなんて、お恥ずかしい限りです。
無事に、動作することを確認しました。

どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)