判断材料

次のようにして、失敗することは分かっているが、
ImageIO.read(in)で二枚目の画像の取得を試み、
失敗して戻ってきた後のストリームの内容を読み出す。

...snip
        out.println("set terminal png");
        out.println("plot sin(x+pi/10)");
        out.println("set output");
        out.flush();

        BufferedImage image2 = ImageIO.read(in);
        System.err.println(image2);

        loop:
        for (int n = 0; n < ROWS; n++) {
            for (int m = 0; m < COLS; m++) {
...snip
BufferedImage@1c45731: type = 13 IndexColorModel: #pixelBits = 8 numComponents =
 3 color space = java.awt.color.ICC_ColorSpace@1388e5e transparency = 1 transInd
ex   = -1 has alpha = false isAlphaPre = false ByteInterleavedRaster: width = 64
0 height = 480 #numDataElements 1 dataOff[0] = 0
null
 49 45 4e 44 ae 42 60 82 89 50 4e 47 0d 0a 1a 0a
 00 00 00 0d 49 48 44 52 00 00 02 80 00 00 01 e0
 08 03 00 00 00 02 0f 2c d6 00 00 01 32 50 4c 54
 45 ff ff ff 00 00 00 a0 a0 a0 ff 00 00 00 c0 00
 00 80 ff c0 00 ff 00 ee ee c0 40 00 c8 c8 00 41
 69 e1 ff c0 20 00 80 40 c0 80 ff 30 60 80 8b 00
 00 40 80 00 ff 80 ff 7f ff d4 a5 2a 2a ff ff 00
 40 e0 d0 00 00 00 1a 1a 1a 33 33 33 4d 4d 4d 66
 66 66 7f 7f 7f 99 99 99 b3 b3 b3 c0 c0 c0 cc cc
 cc e5 e5 e5 ff ff ff f0 32 32 90 ee 90 ad d8 e6
 f0 55 f0 e0 ff ff ee dd 82 ff b6 c1 af ee ee ff
 d7 00 00 ff 00 00 64 00 00 ff 7f 22 8b 22 2e 8b
 57 00 00 ff 00 00 8b 19 19 70 00 00 80 00 00 cd
 87 ce eb 00 ff ff ff 00 ff 00 ce d1 ff 14 93 ff
 7f 50 f0 80 80 ff 45 00 fa 80 72 e9 96 7a f0 e6
 8c bd b7 6b b8 86 0b f5 f5 dc a0 80 20 ff a5 00

前に示した一枚目の画像を取得した後に残っていたストリームの内容と比較すると、
最初の8バイト分

 6d f7 3e af 00 00 00 00 ...

が、二回目のImageIO#readの呼び出しで消費されていることが分かる。
つまり、このメソッドは与えられたバイトストリームの最初の8バイトで画像であるか否かを判断しているらしい。