According to @uckelman's comment on this post, Java's decoder makes a different assumption about the format of the image than most other renders when the image is missing the JFIF header:
I believe the answer to your question of how to detect the bad JPEGs
is found here and here. What you have is a JPEG with no JFIF marker.
All other image loaders assume that the data is YCbCr in that case,
except for ImageIO, which assumes that it is RGB when channels 1 and 2
are not subsampled. So, check whether the first 4 bytes are FF D8 FF
E1, and if so, whether channels 1 and 2 are subsampled. That's the
case where you need to convert.