オブジェクトをObjectOutputStream
で書き出してJarOutputStream
でJarファイルにて、
そのJarファイルをJarInputStream
で読み込んでObjectInputStream
のコンストラクターを呼び出したところで例外が飛んできます…
以下のようなことをしていますが、どうにも成功しません。
出力
①オブジェクトをObjectOutputStream
で一時出力
②出力された一時ファイルをObjectInputStream
で読み込む
③ストリームからbyte[]を取得
④JarOutputStream
で書き出し
圧縮しなければ問題ないので、①と②に問題はないかと…
具体的には
java
1 2//一時ファイル書き出しは省略 3//tempFileは書き出した場所とおなじFileクラス。 4 5//例外処理省略 6 7byte[] objectData = ObjectInput(tempFile);//読み込む 8 9jos = new JarOutputStream(new FileOutputStream(new File("test.jar"))); 10jos.setMethod(JarOutputStream.STORED); //無圧縮を指定 11 12JarEntry entry = new JarEntry("data"); //格納ファイル名 13 14entry.setSize(objectData.length); //データサイズをセット 15 16CRC32 crc = new CRC32(); 17crc.update(objectData); 18entry.setCrc(crc.getValue()); //CRCをセット 19 20jos.putNextEntry(entry); 21jos.write(objectData); 22 23/* 条件によって複数ファイル格納 */ 24//テスト時はファイルいっこだけで試してみました。 25 26jos.flush(); 27
最初のObjectInput
はこんな感じになってます
java
1 public static byte[] ObjectInput(File file) throws IOException{ 2 3 ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)); 4 byte[] data = new byte[(int) file.length()]; 5 6 ois.read(data); 7 8 ois.close(); 9 return data; 10 }
出力自体は成功してるように思います。
出力されたファイル内のtestが格納されており、
ファイルサイズがもとの一時ファイルと一致しているので…
CRCがメタデータなのか、ファイルに含まれるのか、
よくわからないのでそこが原因かもしれませんが…
読み込み
①指定されたファイル(ここでは上記したファイルを読み込む)をJarInputStream
で読み込む
②.getNextJarEntry()
を使ってJarEntryを取得
(ファイルは正しいものとして進めさせてください。実際圧縮しなければ読み込めました。)
③FileOutputStream
で一時出力
④一時ファイルをObjectInputStream
で読み込む←ここで例外が飛ぶ
⑤オブジェクトを.readObject()
で取得
例外の内容としては、
java
1java.io.StreamCorruptedException: invalid stream header: 00000000
もし圧縮すると、
java
1java.io.StreamCorruptedException: invalid stream header: 504B0304
という例外が同じところで飛んできます。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/20 07:52
2015/12/20 08:22