• ,

Использование UML в разработке и сопровождении java-программ

UML (Unified Modeling Language) — унифицированный язык моделирования.
Узнал об UML из замечательного повествования на форуме от alex8894
Обзор CASE-средств для построения диаграмм UML.
В книге «UML for Java Programmers» Robert Cecil Martin, насколько понял, используются стандарты UML 1, т. к. ныне действующий UML вступил в действие уже после её опубликования. Однако, полагаю, основные принципы построения подобных блок-схем остались без существенных изменений.
Учебный пример из лекции:

/*
 * © Volodya Mozhenkov 2015
 * GPL version 3.0
 * Almost University http://www.almost-university.com/
 * VladimirMozhenkov@yahoo.com
 *
 */
// файл Main.java
public class Main
{
    private static void printRes(MyResult r)
    {
        if(r.hasResult())
        {
            System.out.print("Результат исполнения: ");
            System.out.println(r.getResult());
        }
        else
        {
            System.out.println("Результат отсутствует");
        }
    }
    public static void main(String[] args)
    {
        MyCalculator c1 = new MyCalculator('/');
        MyResult r = c1.calculate(4, 2);
        printRes®;
        r = c1.calculate(40, 13);
        printRes®;
        r = c1.calculate(1, 0);
        printRes®;

        c1 = new MyCalculator('^');
        r = c1.calculate(2, 25);
        printRes®;
    }
}

// файл MyCalculator.java
public class MyCalculator
{
    private class ResultClass implements MyResult
    {
        boolean valid;
        int result = 0;
        public ResultClass()
        {
            valid = false;
        }
        public ResultClass(int result)
        {
            this.result = result;
            valid = true;
        }
        public int getResult()
        {
            return result;
        }
        public boolean hasResult()
        {
            return valid;
        }
    }
    private char operation;

    public MyCalculator(char operation)
    {
        this.operation = operation;
    }

    public MyResult calculate(int a, int b)
    {
        MyResult res;

        switch(operation)
        {
            case '*':
                res = new ResultClass(a*b);
                break;
            case '/':
                if(b!=0)
                {
                    res = new ResultClass(a/b);
                }
                else
                {
                    res = new ResultClass();
                }
                break;
            case '+':
                res = new ResultClass(a+b);
                break;
            case '-':
                res = new ResultClass(a-b);
                break;
            default:
                res = new ResultClass();
                break;
        }
        return res;
    }
}

// файл MyResult.java
public interface MyResult
{
    public int getResult();
    public boolean hasResult();
}

И, используя одну из бесплатных версий программ, довольно быстро нарисовал такую блок-схему этой программы на смартфоне (естественно с шибками, так как только начал интересоваться UML):
Image Hosted by PiXS.ru
Интересно было бы посмотреть и сравнить с тем, какую UML- схему/диагамму этой же программы построит Intellij IDEA.
  • ,

Начинающим Java-разработчикам дадут шанс посетить крупнейшую в Восточной Европе конференцию по Java почти бесплатно

Почему нужно: Кто только начинает свою карьеру в качестве Java разработчика, тот на 100% может быть уверен, что JEEConf будет ему интересна, но если Его компания не хочет за Него заплатить, и такой человек не имеет достаточно высокую зарплату, чтобы купить билет, то программный комитет конференции сделает всё возможное, чтобы дать таким желающим возможность посетить конференцию почти бесплатно.
Время и место: 26-27 мая 2017 года, Киев.
Как попасть: Как я понял, возможности более дешёвого посещения конференции три: почти бесплатное посещение — для недавно начавших работать Java разработчиков, которым компания не может оплатить билет, второй вариант — около 150 долларов по самой ранней стоимости для остальных желающих, при покупке билета заранее, как только будет такая возможность на сайте конференции, плюс при наборе группы от 5 человек даётся скидка в 10%, и третий вариант — 50% скидки студенту универа. Будет программа для Junior, возможно там будет скидка для неработающих Java-новичков 40%. Пока не могут сказать. Нужно следить за обновлениями. На сайте указано, что 1000 билетов будут доступны на основных днях конференции, и 15 билетов на обучение в учебные дни, которые будут организованы как семинары до начала конференции. Билеты будут продаваться в 4 этапа. Окончательный вариант программы конференции будет опубликован 6 апреля.
Сайт мероприятия: jeeconf.com/
xpinjection.com/articles/jeeconf-2017-call-for-speakers/


Вот список тем, которые программный комитет конференции выбрал в качестве приоритетных на 2017 год:

Java 9
functional programming in Java (StreamEx, jOOL, Javaslang, etc)
Spring 5
reactive model and implementations (RxJava, Vert.x, Akka, Play, etc.)
accelerators like Spring Boot, JHipster, etc.
web development
distributes systems
cloud development and infrastructure
machine learning and big data

По правилам конференции, большая часть докладов будет напрямую связана с Java/JVM платформой и основана на практическом опыте докладчиков. Участников ожидают 5 параллельных тематических потоков и дополнительный зал для альтернативных форматов (мастер-классы, BoF, панельные дискуссии).

Если кому есть чем поделиться с Java-сообществом, комитет будет рад видеть таких людей среди докладчиков. Начинающим докладчикам программный комитет поможет подготовиться к выступлению, сделать его более интересным и полезным для участников.

Ну и конечно же, можно вспомнить, как это было в прошлом году:
www.youtube.com/watch?list=PLYj3Bx1JM6Y7BKivc3eZwRUhWwBmbIFXg&v=H7rjoRGwL8o
  • ,

level07.lesson09.task04 У кого быстрее алгоритм работает? Конкурс.

Интересно, полагаю, будет посмотреть на самые быстродействующие алгоритмы решения этой задачи. Естественно, что число записей в списке должно быть таким, чтобы время выполнения программы на компьютере можно было бы легко вычислить. Так создадим единый список из ста тысяч строк и сравним время выполнения…

N.B.!
1. Согласно пункту 2.2. предложенной задачи: «удваивать все слова содержащие букву «л».», для единообразия станем так:

На входе:
роза
лира
лоза
ложка
коза
кора
коралл
сорока
носорог
финал

На выходе:
лира
лоза
лоза
ложка
ложка
коза
коралл
финал
финал


2. Список один и тот же, и хотя он формируется путем десяти тысячекратного повторения из десяти строк, считаем его случайным.
3. Срок самостоятельной публикации конкурсных вариантов решения этой задачи истекает 5 февраля 2017 года в 12 часов дня (время московское).
4. Каждый участник форума может самостоятельно оценить быстродействие предложенных вариантов на своем компьютере и поставить «плюсик» тому, кого он считает победителем в этом конкурсе."


/*
ТЕКСТ КОНКУРСНОЙ ЗАДАЧИ СО ВСЕМИ КОРРЕКТИРОВКАМИ ИСХОДНОЙ ЗАДАЧИ level07.lesson09.task04:
*/


/*

2. Метод fix должен:
2.1. удалять из списка строк все слова, содержащие букву «р»
2.2. удваивать все слова содержащие букву «л».
2.3. если слово содержит и букву «р» и букву «л», то оставить это слово без изменений.
2.4. с другими словами ничего не делать.
Пример:
роза
лира
лоза
ложка
коза
кора
коралл
сорока
носорог
финал
...
Выходные данные:
лира
лоза
лоза
ложка
ложка
коза
коралл
финал
финал
...
*/



import java.util.ArrayList;

public class ManipulationsWithTheList {

    public static void main(String[] args) throws Exception
    {
        long startTime = System.currentTimeMillis();

        ArrayList<String> list = new ArrayList<String>();

        for (int i = 0; i < 10000 ; i++) {
            list.add("роза");
            list.add("лира");
            list.add("лоза");
            list.add("ложка");
            list.add("коза");
            list.add("кора");
            list.add("коралл");
            list.add("сорока");
            list.add("носорог");
            list.add("финал");
        }

        list = fix(list);

        for (String s : list)
        {
            System.out.println(s);
        }

        long timeSpent = System.currentTimeMillis() - startTime;

        System.out.println("Эта программа выполнялась " + timeSpent + " миллисекунд.");
    }

    public static ArrayList<String> fix(ArrayList<String> list)
    {
        //напишите тут ваш код

    }
}


Дополнение от 31.01.2017
Уважаемые коллеги!
Настоятельно прошу еще раз ознакомиться со всеми условиями конкурсной задачи. Особо отмечу следующее:
на входе упорядоченная коллекция строк;
на выходе также должна быть упорядоченная коллекция строк (вывод её в консоль используется исключительно для визуального подтверждения верности произведенных манипуляций с исходной псевдослучайной коллекцией);
— сколько времени выполнялся метод fix, просьба, вывести в консоль дополнительно.

Ссылки на все конечные полные тексты программ участвующих в конкурсе будут находиться в самом первом сообщении темы. Просьба к участникам опубликовать их в своих сообщениях с пометкой: «НА КОНКУРС», чтобы я смог бы их собрать вместе и опубликовать.

Конкурсанты:
Torin текст программы содержит отклонения от конкурсной задачи
JuriMik текст программы
Javin текст программы
Himeg текст программы
Тестирование

Проводилось на:
Intel Core i7-2600 CPU @ 3.4 GHz x 4, RAM 16 GB

Windows 7 professional x64
JRE 1.8.0_121
IDE Eclipse Java EE IDE for Web Developers. Version: Neon.1a Release (4.6.1)

Linux Mint 17 Cinnamon 64-bit (v. 2.2.16) 3.13.0-24-generic
JRE 1.8.0_25
IDE Eclipse Java EE IDE for Web Developers. Version: Neon.2 Release (4.6.2)

Средние арифметические значения времени выполнения метода fix (в миллисекундах) подсчитывались по десяти попыткам:
  • ,

Начинающим Java-разработчикам дадут шанс посетить крупнейшую в Восточной Европе конференцию по Java почти бесплатно

Почему нужно: Кто только начинает свою карьеру в качестве Java разработчика, тот на 100% может быть уверен, что JEEConf будет ему интересна, но если Его компания не хочет за Него заплатить, и такой человек не имеет достаточно высокую зарплату, чтобы купить билет, то программный комитет конференции сделает всё возможное, чтобы дать таким желающим возможность посетить конференцию почти бесплатно.
Время и место: 26-27 мая 2017 года, Киев.
Как попасть: Как я понял, возможности более дешёвого посещения конференции три: почти бесплатное посещение — для недавно начавших работать Java разработчиков, которым компания не может оплатить билет, второй вариант — около 150 долларов по самой ранней стоимости для остальных желающих, при покупке билета заранее, как только будет такая возможность на сайте конференции, плюс при наборе группы от 5 человек даётся скидка в 10%, и третий вариант — 50% скидки студенту универа. На сайте указано, что 1000 билетов будут доступны на основных днях конференции, и 15 билетов на обучение в учебные дни, которые будут организованы как семинары до начала конференции. Билеты будут продаваться в 4 этапа. Окончательный вариант программы конференции будет опубликован 6 апреля.
Сайт мероприятия: jeeconf.com/
xpinjection.com/articles/jeeconf-2017-call-for-speakers/


Вот список тем, которые программный комитет конференции выбрал в качестве приоритетных на 2017 год:

Java 9
functional programming in Java (StreamEx, jOOL, Javaslang, etc)
Spring 5
reactive model and implementations (RxJava, Vert.x, Akka, Play, etc.)
accelerators like Spring Boot, JHipster, etc.
web development
distributes systems
cloud development and infrastructure
machine learning and big data

По правилам конференции, большая часть докладов будет напрямую связана с Java/JVM платформой и основана на практическом опыте докладчиков. Участников ожидают 5 параллельных тематических потоков и дополнительный зал для альтернативных форматов (мастер-классы, BoF, панельные дискуссии).

Если кому есть чем поделиться с Java-сообществом, комитет будет рад видеть таких людей среди докладчиков. Начинающим докладчикам программный комитет поможет подготовиться к выступлению, сделать его более интересным и полезным для участников.

Ну и конечно же, можно вспомнить, как это было в прошлом году:
www.youtube.com/watch?list=PLYj3Bx1JM6Y7BKivc3eZwRUhWwBmbIFXg&v=H7rjoRGwL8o

Технические вопросы на собеседовании.

Привет всем, Джаварашовцы!

Так уж случилось, что недавно я проходил собеседование и хотел бы рассказать, какие вопросы мне задавали предполагая, что идет позиция Junior++. Т.е. еще не мидл, но уже и не зеленый джун.

Так вот, собеседование проходило по такому плану
  1. JavaCore
  2. ООП
  3. REST
  4. Базы данных.
  5. Инструменты, которыми пользуешься.

JavaCore

  • Вначале меня попросили нарисовать иерархию интерфейсов у Коллекций.(Это было не сложно, там всего их несколько(Collection,List,Set,Queue,Map). )
  • В чем различие ArrayList и LinkedList(это один из замых заезженных вопросов и ответов в инетах просто тьма). Обсудили скорость выполнения запросов в них и какая разница между листами.
  • Вопрос про класс Object. какие у него методы, что они делают.
  • Рефлексия. что делает метод getClass(). Очень интересный вопрос, разберите его. Особенно про то, как получить всё про класс, пусть даже там приватные методы или переменные.
  • Спросили за многопоточность. Слабенько, как я считаю, так рассказать как ты понимаешь что такое многопоточность. Что нужно, чтоб запустить новый поток. Реально, если вы 20+ уровень, то эти вопросы для вас покажутся смешными.
  • Что можешь сказать про Stream. Это имеется в виду не про Java 8. Имеется в виду потоки ввода и вывода. Как базовые интерфейсы, какие они (символьные и байтовые). На понимание, никакой конкретики.
  • Исключения. Здесь опять-таки попросили нарисовать иерархию исключений, какие бывают, какие из них checked, а какие unchecked. Что нужно делать с Runtime исключениями. Назовите самое часто попадающее(NullPointerException)
  • Вопрос с тем, что нужно делать с checked исключениями(пробрасывать дальше или обработать — понятно и то и другое.)

ООП

  • Что такое ООП в двух словах?
  • Какие еще есть парадигмы программирования? В чем их различие от ООП
  • Какие основные принципы ООП?(наследование, полиморфизм и инкапсуляция) Рассказать про каждый из них. Пока всё абстракатно, не привязываясь к какому-то языку.
  • Задача на понимание проектирования систем: есть Лошадь и Птица. Нужно получить Пегаса. принцип «has a» и «is a»

REST

  • Что такое REST. В википедии об этом говориться очень круто. Реально статьи из википедии для ознакомления хватит
  • HTTP. Здесь тоже общие фразы. Его методы, для чего каждый из них.
  • Коды состояния HTTP. на какие пять частей делиться, расскажите про самые известные (200,204,404,500,501). Зачем они. Спросили еще про 401 и 403. Но я не знал их. Сказали они важные.

Базы данных

Здесь я рассказал, что знаю MySQL. Рассказал про три нормальные формы. Рассказал про Join'ы, какие бывают и нарисовал пересечение областей, в котором используются разные джоины. Рассказал про то, как я понимаю реляционную БД. Не забыл еще о про MongoDB — это NoSQL база данных. Через некоторе время я напишу и про это.

Другие Инструменты
Здесь мы прошлись по моем резюме. У меня было написано, что использую Maven/Gradle для сборки, использую JIRA для тасков, git, Docker, Swagger. Для Continuous Integration — Stash, Bamboo, Puppet. Для тестирования JUnit, Mockito, JMeter.


Я мог что-то забыть, поэтому если интересно — спрашивайте в комментариях постараюсь ответить.

Это была первая часть собеседования. Теперь жду результаты и если да, то будет вторая часть. Напишу о ней как только так сразу.
Всем кому статья понравилась и была полезна — ставьте "+". Пишите в комментариях.

См. также мои другие статьи:
Тестовое задание: «Написать Интерпретатор на язык BrainFuck»
Тестовое задание «Image Comparison»
Java — быстрее, сильнее и выше! Зарплаты украинских программистов.
История успеха спустя 1.5 года от начала обучения
Технические вопросы на собеседовании.
Как найти работу? Рассылка резюме
Профессиональное выгорание. Как устоять?
Английский для IT и для собеседования
Паттерн Command своими словами.
Паттерн Singleton своими словами.
Как создать исполняемый jar в Intellij IDEA / how to create jar in IDEA
Помогите, нужна мотивация!

Подписывайтесь на мой блог Паттерны Проектирования пишите в нем статьи!
  • ,

Стоит ли работать в направлении PEGA BPM?

Методом пристального всматривания и использования Google, для себя определил, что это платформа, обладающая большим инструментарием компонентов, и создание приложений сводится в первую очередь к установке и настройке этих компонентов. Написание кода сводится к минимуму, а основная работа связана с конфигурированием.

Поправьте меня если я неправильно понял.
Набор видео на Youtube не внушает доверия, толковых мануалов я не обнаружил, а то что есть ограничивается беглым обзором платформы на очень «грязном» английском.

Стоит ли связывать с этим свою жизнь, если хочется работать именно программистом, а не конфигуратором, вооруженным мышкой? Даст ли какой-то опыт, дополнительный вес вакансии для Java разработчика, время работы с PEGA BPM?

Отпугивает заточка под мышку, минимальное вмешательство в код, отсутствие хороших, свободно доступных мануалов.
  • ,

Как инициализировать переменную logger в методе setUp, что бы она выполнялась для всех метод с тэгом @Test?

Как инициализировать переменную logger в методе setUp, что бы она выполнялась для всех метод с тэгом @Test?


public class TestClass {

    private static WebDriver driver;
    
    @BeforeClass
    public static void setUp(){
    	
        System.setProperty("webdriver.chrome.driver", "D://Програмирование//ChromeDriver//chromedriver.exe");
        driver = new ChromeDriver();

    }

    @Test
    public void Login() throws InterruptedException{
    	
    	 ExtentReports logger = ExtentReports.get(TestClass.class);
     	logger.init ("D:\\Програмирование\\report\\newreport.html", true); 
    	logger.startTest("TC1");
    	
    	driver.manage().window().maximize();
        driver.get("https://bigmir.net");
        Thread.sleep(2000);
        logger.log(LogStatus.INFO, "Portal is open");

        if(driver.getPageSource().contains("Clients")){
        	logger.log(LogStatus.PASS, "Data was verify");
        	}else{
        		logger.log(LogStatus.FAIL, "Admin was sign in");
        	}
         
        logger.attachScreenshot("D:\\Програмирование\\report\\pict");
        
        logger.endTest();
    }

    
    @Test
    public void AddCat() throws Exception {
    	
    	 ExtentReports logger = ExtentReports.get(TestClass.class);
     	logger.init ("D:\\Програмирование\\report\\newreport.html", true);
     	
    	logger.startTest("TC2");
   
  	driver.findElement(By.partialLinkText("Tesla")).click();
  	Thread.sleep(2000);

      if(driver.getPageSource().contains("Category with same Name already exists.")){
      	logger.log(LogStatus.PASS, "Cat was added");
        	}else{
        		logger.log(LogStatus.FAIL, "Cat was added");
        	}      
           
      driver.findElement(By.xpath("/html/body/div[6]/div[7]/div/button")).click();
      Thread.sleep(1000);                       
      logger.endTest();
     
    }

    @Test
    public void Setpassword() throws Exception {
    	
    	ExtentReports logger = ExtentReports.get(TestClass.class);
    	logger.init ("D:\\Програмирование\\report\\newreport.html", true);
    	
    	logger.startTest("TC3");
  	  
  	driver.findElement(By.partialLinkText("Tesla")).click();
      Thread.sleep(1000);
      
      driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[1]/nav/div[2]/div[1]/ul/li[3]/a")).click(); //Member
      Thread.sleep(1000);
      driver.findElement(By.partialLinkText("new new")).click(); //Employee
      Thread.sleep(1000);
      driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[3]/div[2]/div/div[2]/div/div[1]/div/div[2]/button")).click(); // Reset password
      Thread.sleep(1000);
      
      logger.log(LogStatus.PASS, "Pass was set");
      
      logger.endTest(); 
      
    }
        
    @AfterClass
    public static void cleanUp(){
    	
    	driver.quit();
    }

}

Зачем используется static и в каких случаях?

Привет всем. Может и глупый вопрос, но не как не могу догнать. Я читал в интернете, смотрел видео и все равно не понимаю. Может тут кто-нибудь объяснит. Заранее спасибо.
  • ,

Сложно ли пересесть с Java на C++ или C#?

Добрый день. Скажите пожалуйста — на сколько сложно будет пересесть с Java на C++ или C# после окончания курса Javarush? Недавно узнал, что моя профильная специальность будет требовать именно знание языков майкрософт, но заканчивать курс заранее совсем не хочется, так как я чувствую, что знания из него откладываются в голове куда лучше разных книг.
  • ,

Нужна помощь в решении задачи

Выполняю тут одну простую задачу (подобные дают на собеседованиях джунам), но реально в ней запутался. Хотелось бы, чтобы кто нибудь взглянул на нее и помог советом. Никаких сторонних технологий в ней нет, только коре. Отпишите в личку кому интересно.

level18.lesson05.task03

package com.javarush.test.level18.lesson05.task03;

/* Разделение файла
Считать с консоли три имени файла: файл1, файл2, файл3.
Разделить файл1 по следующему критерию:
Первую половину байт записать в файл2, вторую половину байт записать в файл3.
Если в файл1 количество байт нечетное, то файл2 должен содержать бОльшую часть.
Закрыть потоки. Не использовать try-with-resources
*/


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;

public class Solution {
    public static void main(String[] args) throws Throwable {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String name1 = reader.readLine();
        String name2 = reader.readLine();
        String name3 = reader.readLine();

        FileInputStream stream = new FileInputStream(name1);
        FileOutputStream out1 = new FileOutputStream(name2);
        FileOutputStream out2 = new FileOutputStream(name3);

        byte[] buffer = new byte[stream.available()];
        stream.read(buffer);

        int count = stream.available();
        int count2 = stream.available()%2==0 ? stream.available()/2 : stream.available()/2 + 1;
        int count3 = count-count2;

        out1.write(buffer, 0, count2);
        out2.write(buffer, count2, count3);

        stream.close();
        out1.close();
        out2.close();
        reader.close();

    }
}


Помогите разобраться, в чём ошибка? Вроде всё предельно просто, но не проходит
  • ,

Ответы на вопросы к собеседованию Level31

1 Может ли объект File соответствовать файлу, которого еще нет?
Да, если передать в конструктор значение директории.

String dirPath = "/";
File f = new File(dirPath);
File[] files = f.listFiles();

Так делают
например для того, чтобы получить массив файлов.

public class MyClass {
    public static void main(String[] args) {
        boolean isObject = false;

        
        File file = new File("/");
        if (file instanceof Object){
            isObject = true;
        }
        boolean isFile = file.isFile(); // Tests whether the file denoted by this abstract pathname is a normal file.
Это из документации
        System.out.println(isObject + " "+ isFile);

    }
}

Вывод: true false
File наследуется от object. Ответ: да
Жду комментариев.
2 Как преобразовать объект File к типу Path?
Метод toPath();
toPath(); //Returns a java.nio.file.Path object constructed from the this abstract path.

3 Зачем нужен класс Files?
Взяли за основу класс File, добавили в него немного нового, переименовывали методы, а в конце еще и разделили на два. Так что теперь есть два новых класса – Path и Files. Path – это, фактически новый аналог класса File, а Files – это утилитный класс (по аналогии с классами Arrays & Collections), в него вынесли все статические методы класса File. Так «правильнее» с точки зрения ООП.
Немного из документов:
public final class Files
extends Object
This class consists exclusively of static methods that operate on files, directories, or other types of files.
In most cases, the methods defined here will delegate to the associated file system provider to perform the file operations.

4 Какие классы для архивации вы знаете?
Неплохая статья на эту тему и выдержка из нее: crypto.pp.ua/2010/06/arxivaciya-v-java/
Для работы с архивами в спецификации Java существуют два пакета – java.util.zip и java.util.jar соответственно для архивов zip и jar. Различие форматов jar и zip заключается только в расширении архива zip. Пакет java.util.jar аналогичен пакету java.util.zip, за исключением реализации конструкторов и метода voidputNextEntry(ZipEntry e) класса JarOutputStream. Ниже будет рассмотрен только пакетjava.util.jar. Чтобы переделать все примеры на использование zip-архива, достаточно всюду
в коде заме¬нить Jar на Zip
5 Как добавить директорию в архив?
Для себя я понял этот вопрос, как добавление пустой директории в готовый архив. Никаких рабочих примеров я не нашел. Вот код: (Он наглядно показывает, что можно в архив положить любой файл, а вот с пустой директорией… я не знаю как ответить, постить на StackOverFlow не стал, за такой вопрос заминусят точно) Если у кого есть предложения, то напишите.

public class Main {
    public static void main(String[] args) {
        String[] myFiles = {"D:\\forJava\\MyArtifactName\\packForTest\\res2.txt",
                "D:\\forJava\\MyArtifactName\\packForTest\\res.txt",
                "D:\\forJava\\MyArtifactName\\packForTest\\res4.txt",
                "D:\\forJava\\MyArtifactName\\packForTest\\testDir\\"
                };
        String zipFile = "D:\\forJava\\MyArtifactName\\packForTest\\res.zip";
        ZipUtility zipUtil = new ZipUtility();
        try {
            zipUtil.zip(myFiles, zipFile);

        } catch (Exception ex) {
            // some errors occurred
            ex.printStackTrace();
        }
    }
}

Вопрос о последней testDir, ее то как раз в получившийся архив JVM не кладет, со всеми остальными txt – файлами норм получается.
ZipUtility.java:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipUtility {

    private static final int BUFFER_SIZE = 4096;

    public void zip(List<File> listFiles, String destZipFile) throws IOException {
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(destZipFile));
        for (File file : listFiles) {
            if (file.isDirectory()) {
                zipDirectory(file, file.getName(), zos);
            } else {
                zipFile(file, zos);
            }
        }
        zos.flush();
        zos.close();
    }

    public void zip(String[] files, String destZipFile) throws IOException {
        List<File> listFiles = new ArrayList<File>();
        for (int i = 0; i < files.length; i++) {
            listFiles.add(new File(files[i]));
        }
        zip(listFiles, destZipFile);
    }

    private void zipDirectory(File folder, String parentFolder, ZipOutputStream zos) throws  IOException {
        for (File file : folder.listFiles()) {
            if (file.isDirectory()) {
                zipDirectory(file, parentFolder + "/" + file.getName(), zos);
                continue;
            }
            zos.putNextEntry(new ZipEntry(parentFolder + "/" + file.getName()));
            BufferedInputStream bis = new BufferedInputStream(
                    new FileInputStream(file));
            long bytesRead = 0;
            byte[] bytesIn = new byte[BUFFER_SIZE];
            int read = 0;
            while ((read = bis.read(bytesIn)) != -1) {
                zos.write(bytesIn, 0, read);
                bytesRead += read;
            }
            zos.closeEntry();
        }
    }

    private void zipFile(File file, ZipOutputStream zos)
            throws  IOException {
        zos.putNextEntry(new ZipEntry(file.getName()));
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                file));
        long bytesRead = 0;
        byte[] bytesIn = new byte[BUFFER_SIZE];
        int read = 0;
        while ((read = bis.read(bytesIn)) != -1) {
            zos.write(bytesIn, 0, read);
            bytesRead += read;
        }
        zos.closeEntry();
    }
}

Код отсюда:
www.codejava.net/java-se/file-io/zip-directories

6 Зачем нужны Properties?
Properties – это файл свойств. Структура его: ключ – значение. Для работы с такими файлами в Java есть класс Properties, он унаследован от HashTable<Object, Object>
Есть статья про манипуляции с ним
www.mkyong.com/java/java-properties-file-examples/

7 В каком виде хранятся данные в файле .properties?
Ключ – значение.
8 Можно ли изменять данные в объекте Properties после загрузки их из файла?
Если он унаследован от HashMap, тогда можно, только потом нужно будет изменения в этот файл отписать. Для этого есть метод setProperty.
Вот код:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * Created by Роман on 12.09.2016.
 */
public class LoadAndSetProperties {

    public static void main(String[] args) {

        Properties prop = new Properties();
        InputStream input = null;
        try {

            input = new FileInputStream("D:\\forJava\\MyArtifactName\\packForTest\\config.properties");

            // load a properties file
            prop.load(input);

            // get the property value and print it out


            prop.setProperty("database", "ddfdfdfdfdf");
            System.out.print(prop.getProperty("database"));
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

Вывод: ddfdfdfdfdf
9 Зачем нужен класс FileReader?
Java Docs:
public class FileReader

extends InputStreamReader

Convenience class for reading character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are appropriate. To specify these values yourself, construct an InputStreamReader on a FileInputStream.
FileReader is meant for reading streams of characters.
Класс для чтения символов файлов. Конструкторы этого класса предполагают, что кодировка символов дефолтная и дефолтный размер буфера являются подходящими. Чтобы задать эти значения самостоятельно, следует построить InputStreamReader над FileInputStream. FileReader предназначен для считывания потоков символов.
10 Зачем нужен класс FileWriter?
public class FileWriter
extends OutputStreamWriter

Convenience class for writing character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are acceptable. To specify these values yourself, construct an OutputStreamWriter on a FileOutputStream.
Whether or not a file is available or may be created depends upon the underlying platform. Some platforms, in particular, allow a file to be opened for writing by only one FileWriter (or other file-writing object) at a time. In such situations the constructors in this class will fail if the file involved is already open.
FileWriter is meant for writing streams of characters.
Класс для записи символов файлов. Конструкторы этого класса предполагают, что кодировка символов дефолтная и дефолтный размер буфера являются приемлемым. Чтобы задать эти значения самостоятельно, следует построить OutputStreamWriter над FileOutputStream. Является ли файл доступен для записи, зависит от используемой платформы. Некоторые платформы разрешают держать файл для записи только одним FileWriter (или другого объекта записи файла), в одно время. FileWriter предназначен для записи потоков символов. Для написания потоков необработанных байтов, используйте FileOutputStream.
Эти классы (FileReader и FileWriter) специально ориентированы для работы с текстом и строками.