JavaRush
Акция
Университет
Java FullStack
Python FullStack
new
Web FullStack
new
Обучение
Курсы
Задачи
Опросы
Игры
Помощь
График пинков
Стажировка
Сообщество
Пользователи
Форум
Чат
Статьи
Истории успеха
Активности
Отзывы
Подписки
Светлая тема
Вопрос
  • Отзывы
  • О нас
  • CS50
Начать
Начать обучение
Начать обучение
  • Все вопросы
JavaRush/Помощь по Java задачам/Все условия выполнены, но валидатор не принимает по треть...
Soros
39 уровень
  • 25.12.2019
  • 467просмотров
  • 8комментариев

Все условия выполнены, но валидатор не принимает по третьему

Вопрос по задаче Собираем файл
Java Core,  8 уровень,  11 лекция
Решен

Собираем файл из кусочков.
Считывать с консоли имена файлов.
Каждый файл имеет имя: [someName].partN.

Например, Lion.avi.part1, Lion.avi.part2, ..., Lion.avi.part37.

Имена файлов подаются в произвольном порядке. Ввод заканчивается словом "end".
В папке, где находятся все прочтенные файлы, создать файл без суффикса [.partN].

Например, Lion.avi.

В него переписать все байты из файлов-частей используя буфер.
Файлы переписывать в строгой последовательности, сначала первую часть, потом вторую, ..., в конце - последнюю.
Закрыть потоки.

Требования:
  • Программа должна считывать имена файлов с консоли, пока не будет введено слово "end".
  • Создай поток для записи в файл без суффикса [.partN] в папке, где находятся все считанные файлы.
  • В новый файл перепиши все байты из файлов-частей *.partN.
  • Чтение и запись должны происходить с использованием буфера.
  • Созданные для файлов потоки должны быть закрыты.
  • Не используй статические переменные.
package com.javarush.task.task18.task1825; import java.io.*; import java.util.*; /* Собираем файл */ public class Solution { public static void main(String[] args) throws IOException { ArrayList<String> list = new ArrayList<>(); Scanner scanner = new Scanner(System.in); String string; while (!(string = scanner.nextLine()).equals("end")) { list.add(string); } Map<Integer, String > map = new TreeMap<>(); int lastIndex = list.get(0).indexOf("part"); for (int i = 0; i < list.size(); i++) { String s = list.get(i); String partStr = s.substring(lastIndex + 4); int part = Integer.parseInt(partStr); map.put(part, s); } String fullName = list.get(0).substring(0, lastIndex-1); // System.out.println(fullName); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(new File(fullName), true)); Set set = map.entrySet(); for (Object o : set) { Map.Entry m = (Map.Entry) o; BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(new File((String) m.getValue()))); byte[] bytes = new byte[bufferedInputStream.available()]; bufferedInputStream.read(bytes); bufferedOutputStream.write(bytes); bufferedInputStream.close(); } bufferedOutputStream.close(); } }
0
Комментарии (8)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Pavlo Plynko Java-разработчик в CodeGym Expert
26 декабря 2019, 09:23
Попробуй использовать конструктор FileInputStream принимающий строку, а не файл.
0
Soros
Уровень 39
26 декабря 2019, 14:33
А почему? Ведь я учусь. Файл в конструктор передавать считается более безопасно, чем строку (наверное, где-то в ютубе было сказано) . В любом случае, как это влияет на выполнение условия последовательности записи?
0
Pavlo Plynko Java-разработчик в CodeGym Expert
26 декабря 2019, 14:51
Не влияет, в твоей программе с последовательностью все ок. Валидатор немного подправить надо.
0
Soros
Уровень 39
26 декабря 2019, 16:54
Ок. Спасибо.
0
Justinian Judge в Mega City One Master
26 декабря 2019, 19:00решение
Строки такие как
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new
FileOutputStream(new File(fullName), true));
и
BufferedInputStream bufferedInputStream = new BufferedInputStream(new
FileInputStream(new File((String) m.getValue())))
Не пишут. Монструозные конструкции, если я попрошу тебя сказать сколько операторов в строке,сколько классов и тд, я не уверен что ты правильно посчитаешь количество, 7 операторов в первой строке, 9 во второй, 4-5 классов, это как карточный домик строить. Каждая строка джава программы должна содержать разумное количество операций. Разумность определяется на глаз, но такое количество это явно далеко за пределами разумности. К примеру в код конвеншене применяемом в компании Гугл, ограничение на 80 символов, и это максимальное количество, у тебя в полтора раза больше. Такое плохо читается, плохо поддерживается и потенциальный источник ошибок. Также не совсем понятно такое решение:
Set set = map.entrySet();
       for (Object o : set) {
           Map.Entry m = (Map.Entry) o;
Вот такие штуки как приведение (Map.Entry) , это потенциальные ошибки в рантайме, чем меньше их в коде тем лучше, есть случаи когда нельзя без приведения, но в данном случае, использование не параметризированных коллекций не рекомендуется. Можно было написать вот так:
Set<Map.Entry<Integer, String>> set = map.entrySet();
        for (Map.Entry<Integer, String> m : set) {
Если ты решил прямо вот так, хотя как я понимаю, здесь же тебе не нужна Map.Entry, тебе только имя файлов нужны? А значит достаточно:
for (String fileName : map.values()) {
и вот тебе итерация по именам файлов. Насчет первых моментов, рекомендую Clean code Роберта Марти
+2
Soros
Уровень 39
26 декабря 2019, 19:20
Спасибо.
0
Ksenia Volkova Java Developer в DXC Master
25 декабря 2019, 19:53
Если программа получит файлы с названиями Lion.avi.part1 Lion.avi.part2 Lion.avi.part3 Lion.avi.part11 как ты думаешь, в каком порядке они окажутся в TreeMap?
0
Soros
Уровень 39
26 декабря 2019, 07:31
В этом случае, как и в любых других комбинациях, порядок будет правильным. Lion.avi.part1 Lion.avi.part2 Lion.avi.part3 Lion.avi.part11 Файлы будут записаны от первой части к последней.
0
Обучение
  • Курсы программирования
  • Регистрация
  • Курс Java
  • Помощь по задачам
  • Цены
Сообщество
  • Пользователи
  • Статьи
  • Форум
  • Чат
  • Истории успеха
  • Активности
Компания
  • О нас
  • Контакты
  • Отзывы
  • FAQ
  • Поддержка
JavaRush JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
Подписывайтесь
Язык интерфейса
Русский
English Українська
"Программистами не рождаются" © 2025 JavaRush
MastercardVisa
"Программистами не рождаются" © 2025 JavaRush