На самом деле read
возвращает целое число ..
public abstract int read() throws IOException
так что он неявно преобразуется в неподписанный байт, сохраняя его в int.
Как указано в документации:
Считывает следующий байт данных из
входной поток. Значение байта
возвращается как int в диапазоне от 0 до
255. Если байт недоступен, потому что конец потока был
достигнут, значение -1 возвращается.
Подумайте о том, что если это байт со знаком, тогда -1
не может использоваться в качестве значения конца потока.
Для OutputStream
у вас есть
public abstract void write(int b) throws IOException
и, как указано в документации, реализация займет 8 младших битов переданного целого числа.