• ,

Собираем файл com.javarush.task.task18.task1825

Не могу понять, почему валидатор не пропускает.

package com.javarush.task.task18.task1825;

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

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

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

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

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

import java.io.*;
import java.util.TreeMap;

public class Solution {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String fileName;
        TreeMap<Integer, String> map = new TreeMap<>();
        String regex = "\\.part\\d+?$";
        while (!"end".equals(fileName = reader.readLine())) {
            if (fileName.matches("(.+)" + regex) && new File(fileName).exists()) {
                int part = Integer.parseInt(fileName.split("part")[1]);
                map.put(part, fileName);
            }
        }
        reader.close();
        File result = new File(map.get(1).split(regex)[0]);
        if (!result.exists()) {
            result.createNewFile();
        }
        FileInputStream fis = null;
        FileOutputStream fos = new FileOutputStream(result);
        for (String s : map.values()) {
            fis = new FileInputStream(s);
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            fos.write(buffer);

        }
        fos.close();


    }
}

7 комментариев

EleNikIvi
Файлы переписывать в строгой последовательности, сначала первую часть, потом вторую, …, в конце — последнюю. — Вы уверены, что это условие выполняется?
EleNikIvi
Снимаю вопрос. Не обратила внимание, что это тримапа
EleNikIvi
Как вариант: а если файлов будет один, а в этой строке: File result = new File(map.get(1).split(regex)[0]); берется второй файл
vtchkn
так я вызываю значение по ключу, а ключ — это номер после слова «part», и он начинается с единицы.
EleNikIvi
На ночь глядя плохо думается… :) А что пишет валидатор?
vtchkn
валидатор вообще ничего не пишет, потому что у меня старая подписка.
Nazarini
File result = new File(map.get(1).split(regex)[0]);
А если первым значением попадется какой-нибудь другой файл?
допустим не Lion.avi.part1 а test.part1?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.