Collections

Несколько заданий из квеста Collections

/* В метод main приходит список аргументов.
Первый аргумент - имя результирующего файла resultFileName, остальные аргументы - имена файлов fileNamePart.
Каждый файл (fileNamePart) - это кусочек zip архива. Нужно разархивировать целый файл, собрав его из кусочков.
Записать разархивированный файл в resultFileName.
Архив внутри может содержать файл большой длины, например, 50Mb.
Внутри архива может содержаться файл с любым именем.
 Пример входных данных. Внутри архива находится один файл с именем abc.mp3:
C:/result.mp3
C:/pathToTest/test.zip.003
C:/pathToTest/test.zip.001
C:/pathToTest/test.zip.004
C:/pathToTest/test.zip.002
 Требования:
 •
 В методе main нужно создать ZipInputStream для архива, собранного из кусочков файлов. Файлы приходят аргументами в main, начиная со второго. 
•
 Создай поток для записи в файл, который приходит первым аргументом в main. Запиши туда содержимое файла из архива. 
•
 Поток для чтения из архива должен быть закрыт. 
•
 Поток для записи в файл должен быть закрыт. 

Разархивируем файл
*/
public class Solution {
    public static void main(String[] args) {
    }
}

Следующее задание:

/*
В отдельных файлах создай классы Service, Model, View, Controller.
Распредели методы из класса Solution по созданным классам учитывая, что должен получиться MVC.
Создай нужные поля класса при необходимости.
Не добавляй своих других методов.
Метод main() оставь в классе Solution.
 Требования:
 •
 Создай класс Service в отдельном файле. 
•
 Создай класс Model в отдельном файле. 
•
 Создай класс View в отдельном файле. 
•
 Создай класс Controller в отдельном файле. 
•
 Перемести реализацию метода getData() в подходящий класс. 
•
 Перемести реализацию метода getStringDataList() в подходящий класс. Учти, что метод getData() находится не в классе Solution. 
•
 Перемести реализацию метода onShowDataList() в подходящий класс. Учти, что метод getStringDataList() находится не в классе Solution. 
•
 Перемести реализацию метода fireShowDataEvent() в подходящий класс. Учти, что метод onShowDataList() находится не в классе Solution. 
•
 Метод main() должен создать объект типа View и вызвать у него подходящий метод. Поведение программы не должно измениться. 
*/
import java.util.ArrayList;
import java.util.List;

/* 
MVC - простая версия
*/
public class Solution {
    public static void main(String[] args) {
        new Solution().fireShowDataEvent();
    }

    public List<String> getData() {
        List<String> data = new ArrayList<String>() {{
            add("First string");
            add("Second string");
            add("Third string");
        }};
        return data;
    }

    public void fireShowDataEvent() {
        System.out.println(onShowDataList());
    }

    public List<String> getStringDataList() {
        return getData();
    }

    public List<String> onShowDataList() {
        return getStringDataList();
    }
} 

Следующее задание с несколькими классами:

/*
Аргументом для класса Solution является абсолютный путь к пакету.
Имя пакета может содержать File.separator.
В этом пакете кроме скомпилированных классов (.class) могут находиться и другие файлы (например: .java).
Известно, что каждый класс имеет конструктор без параметров и реализует интерфейс HiddenClass.
Считай все классы с файловой системы, создай фабрику - реализуй метод getHiddenClassObjectByKey.
Примечание: в пакете может быть только один класс, простое имя которого начинается с String key без учета регистра.
 Требования:
 •
 Реализуй метод scanFileSystem, он должен добавлять в поле hiddenClasses найденные классы. 
•
 Реализуй метод getHiddenClassObjectByKey, он должен создавать объект класса согласно условию задачи. 
•
 Метод main не изменяй. 
•
 Метод getHiddenClassObjectByKey не должен кидать исключений.
*/
 package com.javarush.task.task36.task3606;

public interface HiddenClass {
} 


Класс

package com.javarush.task.task36.task3606.data.second;

import com.javarush.task.task36.task3606.HiddenClass;

public class FirstHiddenClassImpl implements HiddenClass {
}

Класс

package com.javarush.task.task36.task3606;

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

/* 
Осваиваем ClassLoader и Reflection
*/
public class Solution {
    private List<Class> hiddenClasses = new ArrayList<>();
    private String packageName;

    public Solution(String packageName) {
        this.packageName = packageName;
    }

    public static void main(String[] args) throws ClassNotFoundException {
        Solution solution = new Solution(Solution.class.getProtectionDomain().getCodeSource().getLocation().getPath() + "com/javarush/task/task36/task3606/data/second");
        solution.scanFileSystem();
        System.out.println(solution.getHiddenClassObjectByKey("secondhiddenclassimpl"));
        System.out.println(solution.getHiddenClassObjectByKey("firsthiddenclassimpl"));
        System.out.println(solution.getHiddenClassObjectByKey("packa"));
    }

    public void scanFileSystem() throws ClassNotFoundException {
    }

    public HiddenClass getHiddenClassObjectByKey(String key) {
        return null;
    }
}


Класс

package com.javarush.task.task36.task3606.data.second;

import com.javarush.task.task36.task3606.HiddenClass;

public class SecondHiddenClassImpl implements HiddenClass {
    private SecondHiddenClassImpl() {
    }
}
package com.javarush.task.task36.task3606.data.second;

import com.javarush.task.task36.task3606.HiddenClass;

class PackageAccessClass implements HiddenClass {
    PackageAccessClass() {
    }
}