Разделение файла

  • 10
  • Недоступна
Считать с консоли три имени файла: файл1, файл2, файл3. Разделить файл1 по следующему критерию: Первую половину байт записать в файл2, вторую половину байт записать в файл3. Если в файл1 количество байт нечетное, то файл2 должен содержать бОльшую часть. Закрыть потоки.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (125)
  • популярные
  • новые
  • старые
Для того, что бы оставить комментарий вы должны авторизоваться
Shamil18 уровень
позавчера, 14:14
Маленькая загвоздка задачки было лишь в округление в большую сторону можно было бы использовать ceil из Math но не стал заморачиваться и мудрить, а решил так:
int countB2=countB%2==0?countB/2:countB/2+1;
Дмитрий19 уровень, Екатеринбург
пятница, 14:30
странное наблюдение: во втором файле русская кодировка слетает, в какой то непонятной зависимости от количества байт исходного файла. Если их нечетное, то все ок. А если четное, то лезут крякозябры вместо букв. При этом первая часть файла всегда выглядит нормально.
Igor_kj19 уровень, Киев
31 января, 16:35
очень и очень крутая задача, помог решить комент от - "Ярослав" : Решил быстро, но запарился угадывать для валидатора половины, подсмотрел здесь. P.S. Здесь думаю стоит прояснить одну деталь, лично я попался на этом. Просто цитирую комментарий от Anna Yushina: "Да, не сразу я осознала, что 3й параметр в методе write - это количество символов, а не номер последнего символа. В итоге 7 попыток."
Nik20 уровень
4 февраля, 02:28
гениально!!! Спасибо
Shamil18 уровень
позавчера, 14:20
Не может быть 7 попыток из-зи этого т.к. копилятор выдал бы IndexOutOfBoundsException или не компилируешь перед Валей?
Igor_kj19 уровень, Киев
31 января, 16:22
дополнительный параметр который нужно учесть и который не указан в требованиях
Shamil18 уровень
позавчера, 14:21
Все указанно прекрасно
Aleks24 уровень
12 января, 17:31
ещё вариант: byte[] buffer = new byte[fist.available()]; int count = fist.read(buffer); foSt1.write(buffer, 0, count/2 + count%2); foSt2.write(buffer, count/2 + count%2, count/2);
Alexey19 уровень, Москва
7 января, 23:17
Не принял решение вида: int half = (inpStream.available()+1)/2; byte[] bufferArr = new byte[inpStream.available()]; inpStream.read(bufferArr); outStream1.write(bufferArr, 0, half); outStream2.write(bufferArr, half, inpStream.available() - half); пришлось писать тупо if/else - всё как мы любим )
IceBerg25 уровень, Днепр
9 января, 16:16
Не принял, потому как это не верно. В этой строке inpStream.available() будет равен "0": outStream2.write(bufferArr, half, inpStream.available() - half);
Alexey19 уровень, Москва
11 января, 20:10
да, если не экономить строчки кода и сказать int length = inpStream.available(); в самом начале, то всё работает мораль: не экономьте строчки кода, пишите понятный и прозрачный код
Shamil18 уровень
позавчера, 14:23
Не имеешь право менять значение available() пусть даже без сохранения его результат имеет право менять только read
Andrey Gubarev21 уровень, Харьков
30 ноября 2018, 15:24
Жесть, залип на этой задаче. Но разобрался
Дворник20 уровень
12 ноября 2018, 15:50
Только у меня вначале файла странные символы, с кодом "-17", "-69","-65"?
Дворник20 уровень
12 ноября 2018, 15:53
Разобрался, это если UTF-8
DancingShaman23 уровень
3 ноября 2018, 14:37
Пять попыток потратил, но зато понял, как правильно писать аргументы в эти методы, лол.
Андрей23 уровень, Москва
2 июля 2018, 22:47
Лень было здесь записывать байты в буфер, хотел сделать по старинке, 1 байт прочел - 1 записал. Но не учел момент, что
int data = fileInputStream.read(); //В таком случае будет прочитан один байт
// и преобразован в int, все отрицательные значения будут изменены на
// положительные начиная от 127.
-128 => 128 -127 => 129 -1 => 255
byte[] byteArray = new byte[fileInputStream.available()>0];
fileInputStream.read(byteArray); // В таком случае массив byteArray
// заполнится байтами, никаких преобразований с ними не случится.
Правда, после экспериментов, я так и не понял почему ругается валидатор. Потому, как fileOutputStream.write(data), использует параметр типа int, в котором выполняется обратное преобразование в byte. Все попытки копировать файлы, заканчивались созданием полной копией исходного файла. Но таки если решить задачу через fileOutputStream.write((byte)data) валидатор примет это решение. Разницу с и без явного преобразование я не нашел ><
Андрей22 уровень, Минск
22 августа 2018, 12:22
read() и так возвращает int. это если приводить числа, которые не входят в байтовый диапазон от -128 до 127, то будет потеря значений. а если байт со значением -100 привести к типу int, то и на выходе будет -100. как и наоборот.