java.io.ObjectInputStream/java.io.ObjectOutputStream

目的
オブジェクトを保存する。(オブジェクトのシリアライズ)

関連クラス

今回のソース
import java.awt.*;
import java.awt.event.*;
import java.io.*;

class Painter
{
	public static void main(String args[])
	{
		new MainWindow();
	}
}

class MainWindow extends Frame
{
	final Dimension default_size = new Dimension(255,255);
	PainterCanvas canvas;

	public MainWindow()
	{
		super("Paint Tool");

		// ウインドウリスナの定義
		WindowListener listener = new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		};
		addWindowListener(listener);

		// メニューの定義
		MenuBar mb = new MenuBar();
		Menu file = new Menu("File");
		mb.add(file);

		// ファイルを開くダイアログ
		MenuItem file_open = new MenuItem("Open");
		ActionListener file_open_listener = new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				FileDialog dialog = new FileDialog(MainWindow.this,"Load File",FileDialog.LOAD);
				dialog.show();
				String file_name = dialog.getFile();

				try
				{
					// Polygon オブジェクトを読み込む
					FileInputStream file_in = new FileInputStream(file_name);
					ObjectInputStream object_in = new ObjectInputStream(file_in);

					Polygon polygon = (Polygon)object_in.readObject();
					canvas.setImage(polygon);
				}
				catch(Exception ex)
				{
					System.err.println(ex);
				}
			}
		};
		file_open.addActionListener(file_open_listener);

		// ファイルを保存するダイアログ
		MenuItem file_save = new MenuItem("Save");
		ActionListener file_save_listener = new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				FileDialog dialog = new FileDialog(MainWindow.this,"Save As",FileDialog.SAVE);
				dialog.show();
				String file_name = dialog.getFile();

				try
				{
					// Polygon オブジェクトを書き込む
					FileOutputStream file_out = new FileOutputStream(file_name);
					ObjectOutputStream object_out = new ObjectOutputStream(file_out);

					object_out.writeObject(canvas.getImage());
				}
				catch(Exception ex)
				{
					System.err.println(ex);
				}
			}
		};
		file_save.addActionListener(file_save_listener);

		MenuItem file_exit = new MenuItem("Exit");
		ActionListener file_exit_listener = new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				System.exit(0);
			}
		};
		file_exit.addActionListener(file_exit_listener);

		file.add(file_open);
		file.add(file_save);
		file.addSeparator();
		file.add(file_exit);

		setMenuBar(mb);

		// Canvasの生成
		canvas = new PainterCanvas(default_size.width,default_size.height);
		canvas.setSize(default_size);
		add(canvas,BorderLayout.CENTER);

		// Windowの表示
		pack();
		setResizable(false);
		setVisible(true);
	}
}

class PainterCanvas extends Canvas
{
	Polygon polygon;			// Pointの集合
	public int width,height;
	int x,y;

	public PainterCanvas(int width,int height)
	{
		super();

		this.width = width;
		this.height = height;

		polygon = new Polygon();

		// マウスダウンイベント
		MouseListener mouse_listener = new MouseAdapter()
		{
			public void mousePressed(MouseEvent e)
			{
				int point_x = e.getX();
				int point_y = e.getY();

				PaintPoint(point_x,point_y);
			}
		};
		addMouseListener(mouse_listener);

		// マウスドラッグイベント
		MouseMotionListener mouse_motion_listener = new MouseMotionAdapter()
		{
			public void mouseDragged(MouseEvent e)
			{
				int point_x = e.getX();
				int point_y = e.getY();

				PaintPoint(point_x,point_y);
			}
		};
		addMouseMotionListener(mouse_motion_listener);
	}

	// 描画メソッド
	public void update(Graphics g)
	{
		paint(g);
	}

	// 描画メソッド
	public void paint(Graphics g)
	{
		for(int i=0;i<polygon.npoints;i++)
		{
			int x = polygon.xpoints[i];
			int y = polygon.ypoints[i];
			g.drawLine(x,y,x,y);
		}
	}

	// 指定された1dotを描画する
	protected void PaintPoint(int x,int y)
	{
		if(x > width || y > height)
		{
			return;
		}

		polygon.addPoint(x,y);
		repaint();
	}

	// ドットの集合を返す
	public Polygon getImage()
	{
		return(polygon);
	}

	// 指定されたPolygonオブジェクトから、イメージを描画する
	public void setImage(Polygon points)
	{
		Graphics gra = getGraphics();
		gra.clearRect(0,0,width,height);

		this.polygon = points;
		repaint();
	}
}
Source is here. (ZIP Format,1551Byte,Shift-JIS)

コンパイル&実行
javac Painter.java
java Painter

説明
(概略)

イメージを、セーブ/ロードすることの出来る、
モノクロペイントツールです。

オブジェクトを保存、または取り出すようなサンプルを作るのに、
適当な題材を探したところ、ペイントを思い付きました。
恐らく、ソースもさほどは難しくないので、
分かりやすいのではないかと思います。

(サンプルプログラムの説明)

Polygon polygon = (Polygon)object_in.readObject();
ここでキャストしているのは、
readObjectメソッドの返り値がObjectだからです。
ここで、期待するオブジェクト以外のオブジェクトが返って来た場合、
ClassNotFoundExceptionやInvalidClassExceptionがスローされます。
catch(Exception ex)
複数の例外を、まとめてキャッチする時には、
java.lang.Exceptionを使います。
java.io.ObjectInputStream.readObjectメソッドが、
複数の例外をスローする可能性があるので、
まとめて処理してます。
polygon.addPoint(x,y);
Polygonオブジェクトは、複数のポイントを格納するのに適しています。
今回は、白と黒しか扱わなかったので、Polygonを使いましたが、
カラーを扱うように拡張するには、
ColorオブジェクトとPointオブジェクトを持つような、
独自のデータ格納クラスを作れば良いような気がします。
gra.clearRect(0,0,width,height);
既に描かれているイメージと、ロードするイメージが重ならないように、
いったんキャンバスをクリアしています。
このメソッドは、背景色でクリアすることになっているので、
使う時には、注意が必要です。