diff --git a/emelyanov_artem_lab_2/README.md b/emelyanov_artem_lab_2/README.md new file mode 100644 index 0000000..5978d5d --- /dev/null +++ b/emelyanov_artem_lab_2/README.md @@ -0,0 +1,23 @@ +# Распределённое приложение для поиска файлов и обработки чисел +## Описаниe +Данное распределённое приложение состоит из двух консольных Java-приложений, которые работают в контейнерах Docker. Приложения выполняют следующие задачи: + +### file-finder: +Ищет самый большой файл в директории /var/data и копирует его в /var/result/data.txt. +### number-processor: +Считывает числа из файла /var/result/data.txt и сохраняет произведение первого и последнего числа в файл /var/result/result.txt. + +#### Приложения работают совместно через Docker Compose, используя общий том для передачи файлов между контейнерами. + +### Как запустить +1. #### Подготовка данных + Убедитесь, что в директории data находятся файлы, которые вы хотите обработать. Это могут быть текстовые файлы с числами. + +2. #### Сборка и запуск контейнеров + Выполните команду для сборки и запуска контейнеров с помощью Docker Compose: docker-compose up --build + +3. #### Результаты выполнения + #### Приложение file-finder находит самый большой файл в директории /var/data (локально это монтируемая директория data/) и копирует его в файл /var/result/data.txt. + #### Приложение number-processor читает файл /var/result/data.txt и сохраняет произведение первого и последнего числа в файл /var/result/result.txt. + +#### Ссылка на видео https://drive.google.com/file/d/1u7nwZdUI4KHC4NzUAXdOABflYswokGwx/view \ No newline at end of file diff --git a/emelyanov_artem_lab_2/app_1/.gitignore b/emelyanov_artem_lab_2/app_1/.gitignore new file mode 100644 index 0000000..4291186 --- /dev/null +++ b/emelyanov_artem_lab_2/app_1/.gitignore @@ -0,0 +1,31 @@ +### IntelliJ IDEA ### +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store +/.idea/modules.xml +/.idea/vcs.xml diff --git a/emelyanov_artem_lab_2/app_1/.idea/.gitignore b/emelyanov_artem_lab_2/app_1/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/emelyanov_artem_lab_2/app_1/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/emelyanov_artem_lab_2/app_1/Dockerfile b/emelyanov_artem_lab_2/app_1/Dockerfile new file mode 100644 index 0000000..3e87ad7 --- /dev/null +++ b/emelyanov_artem_lab_2/app_1/Dockerfile @@ -0,0 +1,17 @@ +# Используем базовый образ с установленной JDK +FROM openjdk:17-jdk-slim + +# Создаем директорию для исходных файлов +RUN mkdir /var/data + +# Создаем директорию для приложения +WORKDIR /app + +#Копируем исходные файлы приложения внутрь контейнера +COPY src /app/src + +#Компилируем код +RUN javac /app/src/Main.java + +# Определяем команду для запуска приложения +CMD ["java", "-cp", "/app/src", "Main"] \ No newline at end of file diff --git a/emelyanov_artem_lab_2/app_1/src/Main.java b/emelyanov_artem_lab_2/app_1/src/Main.java new file mode 100644 index 0000000..e071e91 --- /dev/null +++ b/emelyanov_artem_lab_2/app_1/src/Main.java @@ -0,0 +1,64 @@ +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; + +public class Main { + + public static void main(String[] args) { + + /* + Ищет в каталоге /var/data самый большой по объёму файл и перекладывает его в /var/result/data.txt. + */ + + File sourceDir = new File("/var/data"); + File targetFile = new File("/var/result/data.txt"); + + // Проверяем, что sourceDir существует и является директорией + if (!sourceDir.exists() || !sourceDir.isDirectory()) { + System.out.println("Каталог " + sourceDir + " не существует или не является директорией."); + return; + } + + File[] files = sourceDir.listFiles(); + if (files == null || files.length == 0) { + System.out.println("Каталог " + sourceDir + " пуст."); + return; + } + + long maxFileSize = -1L; + File maxFile = null; + + // Находим файл с максимальным размером + for (File item : files) { + if (item.isFile() && item.length() > maxFileSize) { + maxFileSize = item.length(); + maxFile = item; + } + } + + if (maxFile != null) { + // Проверяем, существует ли конечная директория, если нет — создаем её + File targetDir = targetFile.getParentFile(); + if (!targetDir.exists()) { + boolean dirCreated = targetDir.mkdirs(); + if (dirCreated) { + System.out.println("Директория " + targetDir + " была успешно создана."); + } else { + System.out.println("Не удалось создать директорию " + targetDir); + return; + } + } + + try { + // Копируем файл + Files.copy(maxFile.toPath(), targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + System.out.println("Самый большой файл: " + maxFile.getName() + " был скопирован в /var/result/data.txt"); + } catch (IOException e) { + System.out.println("Ошибка копирования файла: " + e.getMessage()); + } + } else { + System.out.println("Файлы для копирования не найдены."); + } + } +} \ No newline at end of file diff --git a/emelyanov_artem_lab_2/app_2/.gitignore b/emelyanov_artem_lab_2/app_2/.gitignore new file mode 100644 index 0000000..1c5e2ec --- /dev/null +++ b/emelyanov_artem_lab_2/app_2/.gitignore @@ -0,0 +1,30 @@ +### IntelliJ IDEA ### +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store +/.idea/misc.xml diff --git a/emelyanov_artem_lab_2/app_2/.idea/.gitignore b/emelyanov_artem_lab_2/app_2/.idea/.gitignore new file mode 100644 index 0000000..7c5452a --- /dev/null +++ b/emelyanov_artem_lab_2/app_2/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +/modules.xml +/vcs.xml diff --git a/emelyanov_artem_lab_2/app_2/Dockerfile b/emelyanov_artem_lab_2/app_2/Dockerfile new file mode 100644 index 0000000..69b918c --- /dev/null +++ b/emelyanov_artem_lab_2/app_2/Dockerfile @@ -0,0 +1,17 @@ +# Используем базовый образ с установленной JDK +FROM openjdk:17-jdk-slim + +# Создаем директорию для исходных файлов +RUN mkdir /var/data + +# Создаем директорию для приложения +WORKDIR /app + +#Копируем исходные файлы приложения внутрь контейнера +COPY src /app/src + +#Компилируем код +RUN javac /app/src/Main.java + +# Определяем команду для запуска приложения +CMD ["java", "-cp", "/app/src", "Main"] diff --git a/emelyanov_artem_lab_2/app_2/src/Main.java b/emelyanov_artem_lab_2/app_2/src/Main.java new file mode 100644 index 0000000..2d7b837 --- /dev/null +++ b/emelyanov_artem_lab_2/app_2/src/Main.java @@ -0,0 +1,46 @@ +import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintWriter; +import java.util.Scanner; + +public class Main { + + // Сохраняет произведение первого и последнего числа из файла /var/result/data.txt в /var/result/result.txt. + public static void main(String[] args) { + + File sourceFile = new File("/var/result/data.txt"); + File targetFile = new File("/var/result/result.txt"); + + int firstNumber = 0; + int lastNumber = 0; + boolean isFirstNumber = true; + + try (Scanner scanner = new Scanner(sourceFile)) { + // Считываем числа + while (scanner.hasNextInt()) { + int currentNumber = scanner.nextInt(); + + if (isFirstNumber) { + firstNumber = currentNumber; // Сохраняем первое число + isFirstNumber = false; + } + + lastNumber = currentNumber; // Последнее число обновляется на каждом шаге + } + } catch (FileNotFoundException ex) { + System.out.println("Файл не найден: " + ex.getMessage()); + return; // Выходим, если файл не найден + } + + // Рассчитываем произведение первого и последнего числа + int result = firstNumber * lastNumber; + + // Сохраняем результат в файл + try (PrintWriter writer = new PrintWriter(targetFile)) { + writer.println(result); + System.out.println("Произведение первого и последнего числа: " + result); + } catch (FileNotFoundException ex) { + System.out.println("Ошибка записи в файл: " + ex.getMessage()); + } + } +} diff --git a/emelyanov_artem_lab_2/data/1.txt b/emelyanov_artem_lab_2/data/1.txt new file mode 100644 index 0000000..2988c8b --- /dev/null +++ b/emelyanov_artem_lab_2/data/1.txt @@ -0,0 +1,10 @@ +2 +32 +1 +2 +3 +54 +64 +4 +3 +3 \ No newline at end of file diff --git a/emelyanov_artem_lab_2/data/2.txt b/emelyanov_artem_lab_2/data/2.txt new file mode 100644 index 0000000..4eb4b6f --- /dev/null +++ b/emelyanov_artem_lab_2/data/2.txt @@ -0,0 +1,12 @@ +12 +4 +12 +3 +21 +3 +12 +1 +3 +32 +2 +5 \ No newline at end of file diff --git a/emelyanov_artem_lab_2/data/3.txt b/emelyanov_artem_lab_2/data/3.txt new file mode 100644 index 0000000..36ee730 --- /dev/null +++ b/emelyanov_artem_lab_2/data/3.txt @@ -0,0 +1,9 @@ +12 +2 +1 +2 +4 +3 +1 +2 +3 \ No newline at end of file diff --git a/emelyanov_artem_lab_2/docker-compose.yml b/emelyanov_artem_lab_2/docker-compose.yml new file mode 100644 index 0000000..0ed51ed --- /dev/null +++ b/emelyanov_artem_lab_2/docker-compose.yml @@ -0,0 +1,21 @@ +version: '3' +services: + file-finder: + build: + context: ./app_1 # Путь к первому приложению + dockerfile: Dockerfile + volumes: + - C:/Users/Admin/Desktop/УлГТУ/Распределенные вычисления и приложения/DAS_2024_1/emelyanov_artem_lab_2/data:/var/data # Монтируем директорию с файлами + - shared-result:/var/result + + number-processor: + build: + context: ./app_2 # Путь ко второму приложению + dockerfile: Dockerfile + depends_on: + - file-finder + volumes: + - shared-result:/var/result + +volumes: + shared-result: # Объявляем общий том