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