- - PR -
オブジェクトの分割と結合
1
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 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 ; } } |
|
投稿日時: 2004-06-09 17:32
arraycopyの使い方が間違っています。
|
|
投稿日時: 2004-06-09 17:38
回答ありがとうございます。
自分では、よく分からない状態なので、 もう少し、具体的に教えてもらえませんか? お忙しいところ、申し訳ないのですが、よろしく お願いします。 |
|
投稿日時: 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 ] |
|
投稿日時: 2004-06-09 18:16
ジュニアさん、taroさん、指摘ありがとうございます。
引数の順番を間違えていたなんて、お恥ずかしい限りです。 無事に、動作することを確認しました。 どうもありがとうございました。 |
1
