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

  • 10
  • Недоступна
Считать с консоли три имени файла: файл1, файл2, файл3. Разделить файл1 по следующему критерию: Первую половину байт записать в файл2, вторую половину байт записать в файл3. Если в файл1 количество байт нечетное, то файл2 должен содержать бОльшую часть. Закрыть потоки.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (145)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Владлен19 уровень, Санкт-Петербург
11 апреля, 18:17
Объясните, пожалуйста, кто-нибудь:в задаче про разделение файла... почему при чтении из одного и того же потока методом read(buffer), используя 2 буфера при этом, из файла вторая часть чётко считывается после первой??? Ведь метод описывается как "считывает максимальное количество байт из потока", почему тогда во второй byte[] buffer этот метод знает где взять вторую половину...??? Это решение и понимание этого вопроса упрощает задачу в разы. По байтам считывать пытался, не нравится валидатору(там не всё гладко считывается, некоторые элементы перемешиваются, хотя в целом всё работает), пробовал другой метод read(buffer, off, count), но там как-то не поровну делилось, в итоге подсмотрел и прифигел...Ну почему во второй buffer из потока не читаются те же самые байты, что и в первый? СПАСИБО)
Пётр33 уровень, Москва
14 апреля, 13:15
ты, когда читаешь inputStream.read(), у тебя смещается каретка, которая показывает на символ файла. То есть считал байт, каретка (как у печатной машинки) уехала вперед на 1 байт. я решил так - через считывание размера во временную переменную и деление этого размера на 2:
int fisSize = fis.available();
        while (fis.available() > 0) {
            if (fis.available() > fisSize/2) fos1.write(fis.read());
            else fos2.write(fis.read());
        }
В твоём варианте с буфером надо первую часть файла fis.available() делить на 2 и читать
read(fis.available()/2) //считается первая половина файла, это пишем в fos1.write()
а вторую часть файла уже что осталось непрочитанным писать без деления на 2:
read(fis.available()) //это остаток файла, писать во второй файл fos2.write()
У тебя, видимо, ещё какие-то заморочки с тем, что размер байтов может не делиться на 2 ровно, то есть не быть чётным.
Мишаня19 уровень
четверг, 13:58
я сделал проще, че то с этими массивами байт не пошло)
while (file1.available()>0) {
       buffer.add(file1.read());
    }
buffer.size() = размер)
Maksym19 уровень, Днепр
3 апреля, 18:22
Писал через try с ресурсами, вообще не надо думать где закрывать.
Harry20 уровень, Москва
28 марта, 16:52
Я понимаю, что валидатор вероятно весьма сложная программа, но непринятие решение из-за того что я поток файла из которого читал закрыл сразу по окончанию работы с ним - это не есть хорошо. С точки зрения организации доступа к ресурсам, по окончанию работы с каким либо ресурсом, необходимо немедленно ресурс освободить, ведь им может захотеть воспользоваться другой код. В проекте побольше этого, доступ к файлу бы "провис" на неопределенное время, а если прогер был кривой и не отладил синхронизацию, то могла крашнуться программа.
Мишаня19 уровень
четверг, 14:00
я всегда после цикла закрываю, валидатор ест! возможно у тебя внутри цикла было?)
Harry20 уровень, Москва
четверг, 19:05
К сожалению уже не вспомню что было , но если бы я его закрывал внутри цикла, то команда close() отработала бы только на первой итерации ... дальше думаю был бы Exeption, поскольку мы закрыли поток, а повторно это сделать нельзя, но от ошибок никто не застрахован =)
Евгений20 уровень, Санкт-Петербург
27 марта, 15:35
Снова в конце игра "найди место, в котором надо закрыть поток, чтобы пройти валидацию"
Александр22 уровень, Казань
6 марта, 06:42
Задача решается за 5 минут если читать по одному байту и сразу писать. Заморочился с динамическим буфером в зависимости от размера файла и пишем мелкими порциями, а не сразу половину файла в файл: git
Евгений20 уровень, Днепр
11 марта, 10:08
Кстати, и ваше, мое решения - неверные. Файл может быть существенно больше Integer.MAX_VALUE. Впрочем, этой проблемой, я думаю, грешат 99% решений. :)
Мишаня19 уровень
четверг, 14:01
List расширяется автоматически при добавлении в него)
Ivan Kozlovich20 уровень, Санкт-Петербург
23 февраля, 12:42
Прочитали файл1 в массив. Узнали длину массива. Если длина четная, пишем первую половину массива в файл2, вторую - в файл3. Если длина нечетная, делим длину на 2 без остатка и прибавляем 1-цу, т.е. узнаем, сколько байтов надо записать в файл2 и записываем, остальные байты пишем в файл3.
Shamil20 уровень
17 февраля, 14:14
Маленькая загвоздка задачки было лишь в округление в большую сторону можно было бы использовать ceil из Math но не стал заморачиваться и мудрить, а решил так:
int countB2=countB%2==0?countB/2:countB/2+1;
Николай22 уровень
21 февраля, 19:51
более читаемое решение:
int countB2 = countB / 2 + countB % 2;
Shamil20 уровень
21 февраля, 20:05
Спасибо действительно отличное решение. Как я сам не додумался со своим высшим Физико-Математическим фак.
S20 уровень, Минск
20 марта, 15:57
Математики, лучше так: int countB2 = countB / 2 + 1
Николай22 уровень
20 марта, 17:43
Сергей, а если изначальное значение четное?
Дмитрий31 уровень, Екатеринбург
15 февраля, 14:30
странное наблюдение: во втором файле русская кодировка слетает, в какой то непонятной зависимости от количества байт исходного файла. Если их нечетное, то все ок. А если четное, то лезут крякозябры вместо букв. При этом первая часть файла всегда выглядит нормально.
Николай22 уровень
21 февраля, 19:53
возможно русский шрифт идет в UTF-8 и использует 2 байта
Igor_kj20 уровень, Киев
31 января, 16:35
очень и очень крутая задача, помог решить комент от - "Ярослав" : Решил быстро, но запарился угадывать для валидатора половины, подсмотрел здесь. P.S. Здесь думаю стоит прояснить одну деталь, лично я попался на этом. Просто цитирую комментарий от Anna Yushina: "Да, не сразу я осознала, что 3й параметр в методе write - это количество символов, а не номер последнего символа. В итоге 7 попыток."
Nik24 уровень
4 февраля, 02:28
гениально!!! Спасибо
Shamil20 уровень
17 февраля, 14:20
Не может быть 7 попыток из-зи этого т.к. копилятор выдал бы IndexOutOfBoundsException или не компилируешь перед Валей?
Igor_kj20 уровень, Киев
31 января, 16:22
дополнительный параметр который нужно учесть и который не указан в требованиях
Shamil20 уровень
17 февраля, 14:21
Все указанно прекрасно