The real reason is that the abstract class inherited by FileInputStream is also the base for InputStreams, which must read characters in any encoding and have a method
public int read();
which is used in character read streams to read a single character.
As we all know, char is an unsigned 16-bit integer type.
Therefore, the short one cannot be used, since it has only 32k (or 15 bits) positive values, but for characters we need 64k (or 16 bits).
And we need to (-1) pass the end of the file.
This is the same story with Reader all kinds and kinds.
source share