Здравствуйте.
у меня такой вопрос (/просьба об объяснении), к этой задаче
(Реверс файла. Считать с консоли 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).