Graphics
Graphicsについて分かりづらかったところのメモです。
画像ファイルの読み込み
画像ファイルの読み込み方法はとりあえず3通りあるようです。
ImageIO.read(filename)
Toolkit.getDefaultToolkit().createImage(filename);
Toolkit.getDefaultToolkit().getImage(filename);
ImageIOで読み込んだ場合は画像をその場で読み込んでしまうようです。それに対して、Toolkitで読み込んだ場合は、即座には読み込まれておらず、描画が必要になってはじめて読み込みのためのスレッドが開始するようです。そのため後の処理へすぐに移ります。オブザーバを指定して描画していれば、読み込み完了後自動で再描画されます。
getImageは必要がない限り新しいインスタンスを作らない(Singletonパターン?)ようですが、createImage呼び出す度に新しいインスタンスを生成するといった違いがあるようです。
直列化 - Serializable
ObjectOutputStreamは使いまわせないようです。
たとえば、以下のコードではObjectOutputStreamを再生成(強調部分)しなければ例外が発生します。ObjectOutputStreamでreset()を呼んだらhello2が表示されません。
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject("hello1");
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in = new ObjectInputStream(byteIn);
System.out.println(in.readObject());
byteOut.reset();
out = new ObjectOutputStream(byteOut);
out.writeObject("hello2");
byteIn = new ByteArrayInputStream(byteOut.toByteArray());
in = new ObjectInputStream(byteIn);
System.out.println(in.readObject());
java.nio
大容量のファイルを読み込む際には、java.ioよりもjava.nioで読み込む方が早いんだとか。
エンディアン
Intel CPUでは、メモリに数値データを格納する際にリトル・エンディアン(LITTLE ENDIAN)で記録するが、Javaではシステムによらず、ビッグ・エンディアン(BIG ENDIAN)で記録するらしい。当然、ネイティブのエンディアンで記録した方が速いらしい。ちなみにnioを使えばエンディアンは再設定できます。
ちなみにエンディアンとは、複数バイトのデータ量を持つ数値データを、メモリに格納する時の方式のこと。2バイト以上のデータ量を持つ数値データを記録したり転送するときには1バイトごとに分割するわけで、その際の記録/転送を行なう順番をエンディアンというようです。
ダイレクトバッファ
Javaのヒープ外にバッファを作成したもので、ヒープ上のバッファに比べて高速に動作するが、アロケーションのコストが高い。