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

  • 10
  • Недоступна
Считать с консоли три имени файла: файл1, файл2, файл3. Разделить файл1 по следующему критерию: Первую половину байт записать в файл2, вторую половину байт записать в файл3. Если в файл1 количество байт нечетное, то файл2 должен содержать бОльшую часть. Закрыть потоки.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (153)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Egor19 уровень, Санкт-Петербург
пятница, 21:30
Из-за невнимательности, записывал в файлы пустые байты, не считав их( В итоге, с 7ой попытки допёр(
Anton Rymarenko22 уровень
2 июня, 13:08
И так ,что же я узнал из этой задачи: 1.Для того чтобы записать содержимое файла в два других достаточно одного массива . 2.Без переменной которая подсчитывает количество элементов ,вообще ничего работать не будет .(нельзя просто загрузить весь файл в массив и выкинуть его на запись) 3.outputStream.write(buffer, 0, count); buffer - массив который мы вкладываем в файл, 0-начальный элемент (его можно менять ,это точка входа для записи ),count -количество элементов из массива которое мы хотим положить в наш файл. Надеюсь кому-то поможет .
Дмитрий18 уровень, Новосибирск
5 июня, 05:06
Добавлю, что в методе write() второй аргумент это начальный элемент массива buffer, а count это длина от начального элемента (второй аргумент метода write()). Я до этого долго доходил. Anton Rymarenko, извиняюсь что влез ваш комментарий, просто показалось, что так будет понятное дополнение для других.
АртемGeek24 уровень, Москва
23 мая, 17:48
У меня немного пригорело от задачи. При записи в файл из массива:
fos2.write(buff,0,count1/2);
fos3.write(buff,0,count1/2);
В оба файла запишутся одни и те же байты массива buff. А я думал, что при второй записи, автоматически из массива начинают считываться следующие байты после первой записи, оказывается нет.
АртемGeek24 уровень, Москва
23 мая, 17:57
Немного додумал логически , если бы было два массива и в них по очереди считывались данные, то да, не надо было перемещать начальный индекс. А так делал глупую ошибку)
DenisKa19 уровень, Екатеринбург
4 мая, 14:16
мой голова балит
Riccio26 уровень, Москва
3 мая, 20:07
Пара вариантов, как найти большую половину нечетного числа: count - count / 2 count / 2 + count % 2
Владлен22 уровень, Санкт-Петербург
11 апреля, 18:17
Объясните, пожалуйста, кто-нибудь:в задаче про разделение файла... почему при чтении из одного и того же потока методом read(buffer), используя 2 буфера при этом, из файла вторая часть чётко считывается после первой??? Ведь метод описывается как "считывает максимальное количество байт из потока", почему тогда во второй byte[] buffer этот метод знает где взять вторую половину...??? Это решение и понимание этого вопроса упрощает задачу в разы. По байтам считывать пытался, не нравится валидатору(там не всё гладко считывается, некоторые элементы перемешиваются, хотя в целом всё работает), пробовал другой метод read(buffer, off, count), но там как-то не поровну делилось, в итоге подсмотрел и прифигел...Ну почему во второй buffer из потока не читаются те же самые байты, что и в первый? СПАСИБО)
Пётр41 уровень, Москва
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 ровно, то есть не быть чётным.
Мишаня20 уровень
18 апреля, 13:58
я сделал проще, че то с этими массивами байт не пошло)
while (file1.available()>0) {
       buffer.add(file1.read());
    }
buffer.size() = размер)
Maksym19 уровень, Днепр
3 апреля, 18:22
Писал через try с ресурсами, вообще не надо думать где закрывать.
Harry20 уровень, Москва
28 марта, 16:52
Я понимаю, что валидатор вероятно весьма сложная программа, но непринятие решение из-за того что я поток файла из которого читал закрыл сразу по окончанию работы с ним - это не есть хорошо. С точки зрения организации доступа к ресурсам, по окончанию работы с каким либо ресурсом, необходимо немедленно ресурс освободить, ведь им может захотеть воспользоваться другой код. В проекте побольше этого, доступ к файлу бы "провис" на неопределенное время, а если прогер был кривой и не отладил синхронизацию, то могла крашнуться программа.
Мишаня20 уровень
18 апреля, 14:00
я всегда после цикла закрываю, валидатор ест! возможно у тебя внутри цикла было?)
Harry20 уровень, Москва
18 апреля, 19:05
К сожалению уже не вспомню что было , но если бы я его закрывал внутри цикла, то команда close() отработала бы только на первой итерации ... дальше думаю был бы Exeption, поскольку мы закрыли поток, а повторно это сделать нельзя, но от ошибок никто не застрахован =)
Евгений23 уровень, Санкт-Петербург
27 марта, 15:35
Снова в конце игра "найди место, в котором надо закрыть поток, чтобы пройти валидацию"
Александр23 уровень, Казань
6 марта, 06:42
Задача решается за 5 минут если читать по одному байту и сразу писать. Заморочился с динамическим буфером в зависимости от размера файла и пишем мелкими порциями, а не сразу половину файла в файл: git
Евгений20 уровень, Днепр
11 марта, 10:08
Кстати, и ваше, мое решения - неверные. Файл может быть существенно больше Integer.MAX_VALUE. Впрочем, этой проблемой, я думаю, грешат 99% решений. :)
Мишаня20 уровень
18 апреля, 14:01
List расширяется автоматически при добавлении в него)