Причину, по которой вы читаете 255
(в первом случае), несмотря на то, что пишете -1
, можно увидеть в документации OutputStream.write(int)
( выделение мое):
Записывает указанный байт в этот выходной поток. Общий контракт для write
заключается в том, что в выходной поток записывается один байт. Байт для записи - это восемь младших битов аргумента b
. 24 старших разряда b
игнорируются.
FileOutputStream
не указывает на изменение этого поведения.
В основном, InputStream.read
и OutputStream.write(int)
используют int
s, чтобы разрешить использование unsigned"байтов". Они оба ожидают, что int
будет в диапазоне 0
- 255
(диапазон байта). Поэтому, пока вы вызываете write(-1)
, он будет записывать только «восемь младших битов» -1
, что приводит к записи 255
в файл.
Причина, по которой вы получаете -1
во втором случае, заключается в том, что вы вызываете read
дважды, но в файле только один байт, и вы печатаете результат второго чтения.
Из документации InputStream.read
( упор мой):
Считывает следующий байт данных из входного потока. Байт значения возвращается как int
в диапазоне от 0
до 255
. Если байт недоступен из-за того, что достигнут конец потока, возвращается значение -1
. Этот метод блокируется, пока не будут доступны входные данные, не будет обнаружен конец потока или исключение выброшены.