Собираем файл

  • 10
  • Недоступна
Собираем файл из кусочков. Считывать с консоли имена файлов. Каждый файл имеет имя: [someName].partN. Например, Lion.avi.part1, Lion.avi.part2, ..., Lion.avi.part37. Имена файлов подаются в произвольном порядке. Ввод заканчивается словом "end". В папке, где находятся все прочтенные файлы, создать фа
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (318)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Андрей22 уровень
вчера, 10:21
Arraylist со всеми именами файлов, затем сортировка листа, сплитим любое имя убирая с конца .part№ по какому индексу сплитить имя файла определяем по последнему вхождению символа ".". (пример String newFile = list.get(0).substring(0, list.get(0).lastIndexOf("."))) Затем открываем BufferedWriter с FileWriter и привязываем его к полученному на предыдущем этапе имени файла. В цикле for проходим по созданному ранее Arraylist. В каждой итерации открываем поток BufferReader c FileReader и привязываем к нему имя файла из Arraylist по индексу(счетчику) цикла. Во вложенном цикле while (reader.ready) считываем строку ридером и записываем ее созданным ранее BufferedWriter. После вложенного цикла while используем команду writer.flush() закрываем поток чтения. После цикла for закрываем поток записи. Всё.
Ольга19 уровень, Москва
9 сентября, 10:32
Решила с помощью TreeMap. Большое спасибо за комментарии, что бы я без них делала)))
MartyMcAir19 уровень
30 августа, 19:10
фух, прошел валидацию, не может быть пропустило.. УРА! А все дело было в том, что и написали ниже в комментах.. finalFile = tmp.split(".part")[0]; - но сразу не приметил, а зряя.. (это пишем внутри первого цикла, где tmp = reader.readLine()) А вот брать путь папки и имя файла отдельно, для дальнейших манипуляций с путём .. не принимает findPath = Paths.get(tmp).getParent().toString(); findFname = Paths.get(tmp).getFileName().toString(); - а потом имя файла делил через split("\\."); - и дальше все склеивал в одну нужную String путь к файлу.. мдее..
Константин Петров20 уровень, Москва
27 августа, 08:18
Для анализа имен файлов, как мне кажется, проще всего использовать регулярные выражения. У меня получилось вот это
Pattern.compile("^(.+)\\.part(\\d+)");
Первая группа - это целевое имя файла-получателя, а вторая группа - порядковый номер N в строке .partN
Sergey Skakun22 уровень, Mykolaiv
7 сентября, 10:03
Нашёл ещё более простой способ). Сплитнул по ".part". В результате: [0]-элемент - это имя моего файла-получателя. А [1]-элемент - порядковый номер исходного файла. ЗЫ. Если использовать для хранения частей файла массив, то легко решается вопрос сортировки. Т.к. каждая часть ложится в ячейку массива по номеру исходного файла. В результате получается массив, где все части расположены в правильном порядке.
Igor Zip20 уровень, Одесса
23 августа, 16:34
Для построения порядка файлов используйте TreeMap, где ключ = номер части, значение, файл. Потом перебираем мап и записываем в файл
Сергей19 уровень, Киев
четверг, 07:33
Тоже пошел этим путем
Maxim28 уровень, Москва
9 августа, 11:36
Для автоматической сортировки рекомендую использовать коллекцию TreeSet.
Виолетта20 уровень, Санкт-Петербург
19 августа, 16:02
Но ведь там сортировка по алфавиту, то есть: name1, name11, name12, name13, ... , name19, name2, name 20, name21 и т. д. Upd.: Однако такую сортировку почему-то принимает. Ладно.
Александр 23 уровень, Kharkov
6 августа, 13:34
Подскажите что валидатор хочет
Яков В.19 уровень
28 июля, 14:12
Валидатор просто супер... 8 попыток чтобы понять что BufferedOutputStream нужно инициализировать внутри цикла в котором перебираются файлы для чтения. Вот ответьте на вопрос: почему BufferedOutputStream "нельзя" разместить перед циклом и закрыть после, это же один и тот же файл.. зачем его сто раз дергать??
Павел Минеев31 уровень, Челябинск
28 августа, 05:10
Очень даже можно, у меня всё зашло.
Павел20 уровень
31 августа, 20:06
У меня валидатор тоже так не принял. Хотя вполне логично.
15 июля, 16:40
Ну хоть с чем-то я справился))
jeka22 уровень
23 июля, 16:54
Открыл коментрарии, поржал с этого, решил задачу, первая проверка такая же самая!🤣
Дмитрий26 уровень, Москва
1 июля, 16:26
ВАЖНО! Валидатор принимает решение !только если при открытии потоков записи И чтения вы передаете в них объекты типа String, а не объект типа File.
String mainfile;
//mainfile = без спойлеров
BufferedWriter writer = new BufferedWriter(new FileWriter(mainfile));
Смысла нет. В следующем задании такая же фишка.
Dmitry22 уровень
20 августа, 02:45
не помогло