Здравствуйте. у меня такой вопрос (/просьба об объяснении), к этой задаче (Реверс файла. Считать с консоли 2 имени файла: файл1, файл2. Записать в файл2 все байты из файл1, но в обратном порядке.Закрыть потоки.) как правильное решение, на Javarush Inteliji IDE, приводится (пропускаю строки открытия файловых потоков, только логика)
List<Integer> inputBytes = new ArrayList<>();
     while (fileInputStream.available() > 0) {
         inputBytes.add(fileInputStream.read());
     }
     Collections.reverse(inputBytes);
     for (Integer aByte : inputBytes) {
         fileOutputStream.write(aByte);
     }
Но если я не ошибаюсь, при таком чтении, каждый байт исходного файла - выводится как Integer,т.к. метод .read() возвращает значение типа int, который 4х байтовый, т.е. к каждому прочитанному байту - добавляются ещё три байта, заполненных нолями (т.к. размер Integer - 4 байта, и поэтому добавляются не хватающие 3). потом с порядком этого ArrayList_a делается реверс, и результат выводится во 2й файл, согласно условию. но в моём понимании, при таком подходе, результатом не будут все байты исходника в обратном порядке, а будут добавлены ещё лишние байты, заполненные нолями, появившиеся при приведении прочитанного байта к Integer, которых в исходнике не было. поэтому странно. если я где-то ошибся в своих рассуждениях - буду рад подсказке где именно. моё решение ниже :
List<Byte> list = new ArrayList<Byte>();
        while(fileInputStream.available()>0){
            list.add((byte)fileInputStream.read());
        }
        Byte [] btAr = list.toArray(new Byte[0]);
        for(int i = btAr.length-1;i>=0;i--){
            fileOutputStream.write(btAr[i]);
        }
его тоже валидатор принял. и это тоже для меня немного странно, так как в моём понимании, во 2м решении - не будет тех лишних 3х байтов, которые добавляются к каждому прочитанному байту в 1м решении. и да почему 1е решение правильно всё так же не ясно. стал сомневаться, может я не до конца понимаю логику преобразований типов в I/O потоках, поэтому решил воспользоваться "звонком другу" ). спасибо. P.S. из диалога в комментариях, решил ещё раз подсуммировать логику рассуждений и свой вопрос (несогласие, возможно спорное, с решением на Javarush) итак, что происхдит в 1м решении: (1) - метод fileInputStream.read() - возвращает значение типа int ; "- метод читает один байт из файла и возвращает его как результат. Тип результата расширяется до int." цитата из этой лекции (2) - размер int = 4 байта (32 бита). при вкладывании считанного 1го байта (8бит) в int. т.е. в 4байта - добавляются не хватающие 24 (т.е.32-8) бита, заполненные нулями, что всегда происходит при расширении типа byte до int. (3) так как в примере решения 1 - нет сужения считанного 1 байта, (расширенного методом .read() до 32х битов Integer_a), обратно к 8 битам типа byte, значит, -> -> это решение продолжает оперировать типом int, (где к каждому считанному байту добавлены ещё лишние 24 бита нолей при расширении результата до int).