判断材料
次のようにして、失敗することは分かっているが、
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バイトで画像であるか否かを判断しているらしい。