package com.javarush.test.level18.lesson10.home10;

/* Собираем файл
Собираем файл из кусочков
Считывать с консоли имена файлов
Каждый файл имеет имя: [someName].partN. Например, Lion.avi.part1, Lion.avi.part2, ..., Lion.avi.part37.
Имена файлов подаются в произвольном порядке. Ввод заканчивается словом "end"
В папке, где находятся все прочтенные файлы, создать файл без приставки [.partN]. Например, Lion.avi
В него переписать все байты из файлов-частей используя буфер.
Файлы переписывать в строгой последовательности, сначала первую часть, потом вторую, ..., в конце - последнюю.
Закрыть все потоки ввода-вывода
Темповые файлы создавать нельзя, т.к. на сервере заблокирована возможность создания каких любо файлов
*/

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;

public class Solution {
    public static void main(String[] args) throws IOException
    {
        Scanner scanner = new Scanner(System.in);
        ArrayList<String> parts = new ArrayList<String>();         
        FileInputStream fileInputStream = null;         
        String nextFileName = null;
        //Читаем файлы пока не "end"

        while (true) {
            if ("end".equals(nextFileName = scanner.nextLine())) break;
            else parts.add(nextFileName);
        }
        scanner.close();
        //Сортируем коллекцию

        Collections.sort(parts, new Comparator<String>()
        {
            @Override
            public int compare(String o1, String o2)
            {
                return o1.toString().compareTo(o2.toString());    
            }
        });
        //Выходной файловый поток

        String outputFileName = parts.get(0).split(".part")[0];
        FileOutputStream fileOutputStream = new FileOutputStream(outputFileName);
        //Сливаем файлы

        for (String partsFileNames : parts) {
            fileInputStream = new FileInputStream(partsFileNames);
            byte[] buffer = new byte[fileInputStream.available()];
            fileInputStream.read(buffer);
            fileOutputStream.write(buffer);
            fileInputStream.close();
        }
        fileOutputStream.close();
        System.out.println("Объединение файлов выполнено!");
    }
}

Java — объектно-ориентированнный язык программирования. Что это означает? Что вообще такое объектно-ориентированное програмиирование (ООП)? Зачем оно нужно?

С этими вопросами мы постараемся разобраться подробно.

Все языки объектно-ориентированного программирования предоставляют механизмы, которые  облегчают реализацию объектно-ориентированной модели. Этими механизмами являются инкапсуляция, наследование, полиморфизм. Рассмотрим эти концепции.

Инкапсуляция

Основой инкапсуляции в Java является класс. Класс определяет данные и программный код некоторого набора объектов. Объект является экземпляром класса. Таким образом, класс — это логическая конструкция, а объект – физическая реальность. По сути, класс является шаблоном объекта, в классе описывается структура объекта, а когда объект создается, то он создается согласно данным описанным в классе, подобно тому как создается деталь на заводе согласно ее чертежу. При составлении класса код и данные необходимо специфицировать. Все эти элементы называют членами класса. Члены-переменные или переменные экземпляра или поля являются данными. Члены методы или просто методы – код, оперирующий этими данными.

Цель класса – инкапсуляция сложности. Для этого у методов и переменных внутри класса могут быть модификаторы доступа (public, private).

Инкапсуляция означает, что данные объекта недоступны его клиентам непосредственно. Вместо этого они инкапсулируются — скрываются от прямого доступа извне. Инкапсуляция предохраняет данные объекта от нежелательного доступа, позволяя объекту самому управлять доступом к своим данным.

Статья не окончена и будет дописана.

Продолжение: Шаг 6. Лексические элементы языка Java
Начало: Шаг 4. Пример работы с классами и объектами