私はオブジェクトのコレクションを持っています:
Map<BufferedImage, Map<ImageTransform, Set<Point>>> map
それらをファイルに書き込んでから、同じ構造体でそれらを読み戻せるようにしたいと考えています。
Serializable
BufferedImage は(またはExternalizable
) インターフェイスを実装していないため、コレクションをそのまま記述することはできません。そのため、クラスのメソッドを使用しImageIO
て画像を書き込む必要があります。
ImageTransform
を実装するカスタム オブジェクトですSerializable
。したがって、マップ コレクションの値の部分はそのまま書き込み可能である必要があると思います。
ファイルに書き込むために私が行うことは次のとおりです。
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
for (BufferedImage image : map.keySet()) {
ImageIO.write(image, "PNG", out); // write the image to the stream
out.writeObject(map.get(image)); // write the 'value' part of the map
}
ファイルから読み返すために私が行うことは次のとおりです。
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
while(true) {
try {
BufferedImage image = ImageIO.read(in);
Map<ImageTransform, Set<Point>> value =
(Map<ImageTransform, Set<Point>>) in.readObject(); // marker
map.put(image, value);
} catch (IOException ioe) {
break;
}
}
ただし、これは機能しません。私はマーカーjava.io.OptionalDataException
を取得します。
java.io.OptionalDataException
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1300)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
私の質問は、まず、文章の概念は正しいですか? この場合にImageIO#write
適していますか、BufferedImage#getRgb
int[]
配列の使用/保存について考えるべきですか? 配列はよりコンパクトですか (つまり、ファイル内のスペースが少なくなります) ?
次に、ファイルからオブジェクトを読み取るにはどうすればよいですか? EOF に達したことをどのように知ることができますか? 上記が機能しないのはなぜですか?
提供された情報で十分であることを願っています。何かについてさらに情報が必要な場合は、お知らせください。
前もって感謝します。