Java for Beginner
687 subscribers
586 photos
161 videos
12 files
904 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Процессы и потоки (Process API). Класс ProcessBuilder

1. Введение в процессы и потоки

Процесс — это экземпляр программы, которая выполняется в операционной системе. Каждый процесс имеет собственное адресное пространство, ресурсы и состояние. Например, когда вы запускаете программу на Java, операционная система создает новый процесс для выполнения вашего кода.

Поток (thread) — это наименьшая единица выполнения внутри процесса. Потоки разделяют память и ресурсы процесса, но выполняются независимо. В Java многопоточность позволяет выполнять несколько задач одновременно в рамках одного процесса.

Различия между процессами и потоками:
Процессы изолированы друг от друга, потоки разделяют память.
Создание процесса требует больше ресурсов, чем создание потока.
Потоки легче взаимодействуют друг с другом, чем процессы.


Зачем управлять внешними процессами?
Интеграция с другими программами: Например, вы можете запустить скрипт на Python или вызвать системную команду.
Автоматизация задач: Например, автоматическое создание резервных копий или выполнение системных команд.


2. Класс ProcessBuilder

ProcessBuilder — это класс в Java, который позволяет создавать и управлять внешними процессами. Он предоставляет удобный способ настройки и запуска процессов, включая передачу аргументов, настройку рабочего каталога и перенаправление вывода.

Основные методы ProcessBuilder:
command(String... command) — задает команду и аргументы для выполнения. Например, command("ls", "-l") для Linux или command("cmd.exe", "/c", "dir") для Windows.
start() — запускает процесс и возвращает объект Process.
directory(File directory) — устанавливает рабочий каталог для процесса.
redirectOutput(ProcessBuilder.Redirect destination) — перенаправляет стандартный вывод процесса в файл или другой поток.
redirectError(ProcessBuilder.Redirect destination) — перенаправляет вывод ошибок.


Пример создания и запуска простого внешнего процесса
import java.io.IOException;

public class ProcessBuilderExample {
public static void main(String[] args) {
try {
// Создаем ProcessBuilder для команды "ls -l" (Linux) или "dir" (Windows)
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command("ls", "-l"); // Для Windows: "cmd.exe", "/c", "dir"

// Запускаем процесс
Process process = processBuilder.start();

// Ждем завершения процесса
int exitCode = process.waitFor();
System.out.println("Процесс завершен с кодом: " + exitCode);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}


Объяснение:
Мы создаем объект ProcessBuilder и задаем команду ls -l (список файлов в Linux).
Метод start() запускает процесс.
Метод waitFor() блокирует выполнение программы до завершения процесса.


Плюсы и минусы ProcessBuilder

Плюсы:
Гибкость: можно настраивать рабочий каталог, перенаправлять вывод и ошибки.
Удобство: интуитивно понятный API для работы с процессами.


Минусы:
Зависимость от ОС: команды могут отличаться для разных операционных систем.
Ошибки выполнения: если процесс завершится с ошибкой, нужно обрабатывать исключения.


#Java #Training #Medium #Process_API #ProcessBuilder
👍2
Что выведет код?

public class Task140225 {
public static void main(String[] args) {
int x = 1;
if (x++ > 1) {
System.out.println("A");
} else if (x++ > 2) {
System.out.println("B");
} else {
System.out.println("C");
}
System.out.println(x);
}
}


#Tasks
👍2
Варианты ответа:
Anonymous Quiz
37%
А 1
2%
В 2
46%
С 3
15%
Ничегошеньки
👍4
А он просто покурить вышел... 😂

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3
Вопросы с собеседования 👩‍💻

Какой блок используется для обработки исключений?
Anonymous Quiz
89%
try-catch
11%
if-else
0%
for
0%
while
👍1
Запуск внешних процессов и чтение вывода. Подробности о классе ProcessBuilder

1. Подробное описание класса ProcessBuilder

Класс ProcessBuilder предоставляет мощный инструмент для создания и управления внешними процессами. Он позволяет настраивать команды, аргументы, рабочий каталог, переменные окружения и перенаправление вывода.

Основные методы ProcessBuilder

command(String... command)
Назначение: Устанавливает команду и аргументы для выполнения.
Параметры: Команда и аргументы (например, "ls", "-l").

Пример:
ProcessBuilder processBuilder = new ProcessBuilder("ls", "-l");


start()
Назначение: Запускает процесс и возвращает объект Process.
Возвращаемое значение: Объект Process, который представляет запущенный процесс.


Пример:
Process process = processBuilder.start();


directory(File directory)
Назначение: Устанавливает рабочий каталог для процесса.
Параметры: Объект File, представляющий каталог.


Пример:
processBuilder.directory(new File("/path/to/directory"));


redirectOutput(ProcessBuilder.Redirect destination)
Назначение: Перенаправляет стандартный вывод процесса.
Параметры: Объект ProcessBuilder.Redirect, который может быть файлом или потоком.


Пример:
processBuilder.redirectOutput(ProcessBuilder.Redirect.to(new File("output.txt")));


redirectError(ProcessBuilder.Redirect destination)
Назначение: Перенаправляет вывод ошибок процесса.
Параметры: Объект ProcessBuilder.Redirect.


Пример:
processBuilder.redirectError(ProcessBuilder.Redirect.to(new File("error.txt")));


redirectInput(ProcessBuilder.Redirect source)
Назначение: Перенаправляет стандартный ввод процесса.
Параметры: Объект ProcessBuilder.Redirect.


Пример:
processBuilder.redirectInput(ProcessBuilder.Redirect.from(new File("input.txt")));


environment()
Назначение: Возвращает объект Map, представляющий переменные окружения процесса.
Возвращаемое значение: Map<String, String>, где ключ — имя переменной, значение — ее значение.


Пример:
Map<String, String> env = processBuilder.environment();
env.put("VAR_NAME", "value");


inheritIO()
Назначение: Наследует стандартный ввод, вывод и ошибки от текущего процесса.

Пример:
processBuilder.inheritIO();


2. Пример использования ProcessBuilder с перенаправлением вывода

import java.io.File;
import java.io.IOException;

public class ProcessBuilderRedirectExample {
public static void main(String[] args) {
try {
ProcessBuilder processBuilder = new ProcessBuilder("ls", "-l");

// Устанавливаем рабочий каталог
processBuilder.directory(new File("/path/to/directory"));

// Перенаправляем вывод в файл
processBuilder.redirectOutput(new File("output.txt"));

// Перенаправляем ошибки в файл
processBuilder.redirectError(new File("error.txt"));

// Запускаем процесс
Process process = processBuilder.start();

// Ждем завершения процесса
int exitCode = process.waitFor();
System.out.println("Процесс завершен с кодом: " + exitCode);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}


Объяснение:
Мы перенаправляем стандартный вывод и ошибки в файлы output.txt и error.txt.
Рабочий каталог процесса установлен на /path/to/directory.


#Java #Training #Medium #Process_API #ProcessBuilder
👍2
3. Пример использования переменных окружения

import java.io.IOException;
import java.util.Map;

public class ProcessBuilderEnvironmentExample {
public static void main(String[] args) {
try {
ProcessBuilder processBuilder = new ProcessBuilder("echo", "$VAR_NAME");

// Получаем переменные окружения
Map<String, String> env = processBuilder.environment();
env.put("VAR_NAME", "Hello, World!");

// Запускаем процесс
Process process = processBuilder.start();

// Чтение вывода
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println("Вывод: " + line);
}

int exitCode = process.waitFor();
System.out.println("Процесс завершен с кодом: " + exitCode);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}


Объяснение:
Мы добавляем переменную окружения VAR_NAME и используем ее в команде echo.

4. Пример наследования ввода-вывода

import java.io.IOException;

public class ProcessBuilderInheritIOExample {
public static void main(String[] args) {
try {
ProcessBuilder processBuilder = new ProcessBuilder("ls", "-l");

// Наследуем ввод, вывод и ошибки
processBuilder.inheritIO();

// Запускаем процесс
Process process = processBuilder.start();

// Ждем завершения процесса
int exitCode = process.waitFor();
System.out.println("Процесс завершен с кодом: " + exitCode);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}


Объяснение:
Мы используем inheritIO(), чтобы вывод и ошибки процесса отображались в консоли текущего процесса.

5. Пример обработки ошибок и вывода

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ProcessBuilderErrorHandling {
public static void main(String[] args) {
try {
ProcessBuilder processBuilder = new ProcessBuilder("invalid_command");

// Запускаем процесс
Process process = processBuilder.start();

// Чтение вывода ошибок
BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line;
while ((line = errorReader.readLine()) != null) {
System.out.println("Ошибка: " + line);
}

// Чтение стандартного вывода
BufferedReader outputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((line = outputReader.readLine()) != null) {
System.out.println("Вывод: " + line);
}

int exitCode = process.waitFor();
System.out.println("Процесс завершен с кодом: " + exitCode);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}


Объяснение:

Мы читаем как стандартный вывод, так и вывод ошибок, чтобы обработать все возможные сценарии.

#Java #Training #Medium #Process_API #ProcessBuilder
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Всем доброго субботнего утра! ☀️

Как ваше настроение?

А я сижу над недописанным сервисом доставки, и понимаю что не хочу его дописывать... 😏

Скорее потому, что его проще переписать сначала
🤓

Да и готовиться надо, чтобы радовать Вас контентом, а не своими размышлениями и поисками правильного решения
🫢

Поэтому я принял решение убрать этот недописанный сервис из видео. Когда-нибудь мы обязательно к нему вернемся и напишем полностью за один присест
😎

Ну и чтобы нам было для чего встречаться по воскресениям, я решил разбить создание подобных сервисов на максимально глубокое, пошаговое изучение:
Аннотаций в контроллере
Работу JPA-аннотаций
Мапперы и все то с ними связано
Спецификаций и пагинации для вывода данных

Ну и еще что-нибудь)) Пока накидал так, что сразу в голову пришло 😉

Как Вам план? 🤨

А в остальном всем прекрасных выходных! ✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8
This media is not supported in your browser
VIEW IN TELEGRAM
Тот момент когда надо показать сложный проект заказчику

https://t.me/Java_for_beginner_dev

#Mems
👍3
Всем привет!

Предлагаю сегодня в 16:00 по МСК собраться и наполнить наши головы пониманием, что же такое Mappers 😉

Что мы узнаем:
- Зачем нам вообще нужны Mappers?
- Какие наиболее популярные Mappers есть?
- Рассмотрим часто встречающуюся реализацию - MapStruct.
- Напишем мини-проект в котором реализуем разные варианты настроек MapStruct, рассмотрим варианты реализаций и взаимодействий
.

Как всегда жду всех! 🫵

Но увижу все тех же 🤪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Media is too big
VIEW IN TELEGRAM
Оказывается их так просто запомнить... 🤓

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31
Встреча создана!
https://telemost.yandex.ru/j/29429052127252

Заходим! ✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
Mapper MapStruct. Коротко о важном. Встреча от 16.02.2025

Запись нашей встречи -
YOUTUBE
RUTUBE

На сегодняшней встрече мы разобрали на примере работу мапперов - библиотек которые помогают преобразовывать объекты в друг друга. А также:
- Зачем нам вообще нужны Mappers?
- Какие наиболее популярные Mappers есть?
- Рассмотрели часто встречающуюся реализацию - MapStruct.
- Написали немного кода, посмотрели как все это работает, изучили разные варианты взаимодействий.


Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!

Всем хорошего настроения! 🤘🔫
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
📌 Факт дня:

"А вы знали что... есть язык программирования, который называется 'Whitespace'?"

Этот язык использует только пробелы, табуляции и переходы на новую строку. То есть, вы пишете код, который фактически невидим!


Proof

#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
📌 Цитата дня: Ларри Эллисон

"Если вы будете делать то же, что и все, вы никогда не сможете быть лучше других."


Эллисон сказал это в речи для сотрудников Oracle в 1990 году.

Почитать короткую биографию
https://habr.com/ru/articles/462827/

#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Класс BigInteger в Java — основы и внутреннее устройство

В Java для работы с целыми числами, которые выходят за пределы диапазона long (от -2⁶³ до 2⁶³-1), используется класс BigInteger. Этот класс позволяет работать с числами произвольной длины, что делает его незаменимым для задач, требующих высокой точности, таких как криптография, научные вычисления и финансы.

Внутреннее устройство

Класс BigInteger хранит число в виде массива целых чисел (int[]), где каждый элемент массива представляет часть большого числа. Это позволяет BigInteger работать с числами, которые могут быть сколь угодно большими, ограничиваясь только доступной памятью.
Хранение данных: Число хранится в виде массива int[], где каждый элемент массива представляет 32 бита числа. Это позволяет эффективно использовать память и выполнять операции над большими числами.
Знак: Отдельно хранится знак числа (положительное или отрицательное).


Пример внутреннего представления числа:
BigInteger bigInt = new BigInteger("123456789012345678901234567890");
Внутри это число будет представлено как массив int[], где каждый элемент массива хранит часть числа.


Основные методы класса BigInteger

Конструкторы:
BigInteger(String val) — создает объект BigInteger из строки.
BigInteger(byte[] val) — создает объект BigInteger из массива байт.
BigInteger(int signum, byte[] magnitude) — создает объект BigInteger с указанным знаком и массивом байт.


Пример:
BigInteger bigInt = new BigInteger("12345678901234567890");


Арифметические операции:
add(BigInteger val) — сложение.
subtract(BigInteger val) — вычитание.
multiply(BigInteger val) — умножение.
divide(BigInteger val) — деление.
mod(BigInteger val) — остаток от деления.


Пример:
BigInteger a = new BigInteger("10000000000000000000");
BigInteger b = new BigInteger("20000000000000000000");
BigInteger sum = a.add(b); // 30000000000000000000


Сравнение:
compareTo(BigInteger val) — сравнивает два числа. Возвращает -1, 0 или 1, если текущее число меньше, равно или больше переданного.
equals(Object x) — проверяет равенство двух объектов BigInteger.

Пример:
BigInteger a = new BigInteger("100");
BigInteger b = new BigInteger("200");
int result = a.compareTo(b); // -1, так как a < b


Битовые операции:
and(BigInteger val) — побитовое И.
or(BigInteger val) — побитовое ИЛИ.
xor(BigInteger val) — побитовое исключающее ИЛИ.
shiftLeft(int n) — сдвиг влево на n бит.
shiftRight(int n) — сдвиг вправо на n бит.


Пример:
BigInteger a = new BigInteger("10"); // 1010 в двоичной системе
BigInteger b = a.shiftLeft(2); // 101000 (40 в десятичной)


Другие полезные методы:
pow(int exponent) — возведение в степень.
gcd(BigInteger val) — наибольший общий делитель.
isProbablePrime(int certainty) — проверка на простоту.


Пример:
BigInteger a = new BigInteger("17");
boolean isPrime = a.isProbablePrime(100); // true, так как 17 — простое число


Плюсы и минусы BigInteger

Плюсы:
Поддержка чисел произвольной длины.
Высокая точность вычислений.
Богатый набор методов для арифметических и битовых операций.

Минусы:

Медленнее, чем примитивные типы данных (int, long).
Требует больше памяти для хранения больших чисел.


Пример использования
import java.math.BigInteger;

public class BigIntegerExample {
public static void main(String[] args) {
BigInteger a = new BigInteger("12345678901234567890");
BigInteger b = new BigInteger("98765432109876543210");

BigInteger sum = a.add(b);
BigInteger product = a.multiply(b);

System.out.println("Сумма: " + sum);
System.out.println("Произведение: " + product);
}
}


#Java #Training #Medium #BigInteger
👍2
Что выведет код?

public class Task170225 {
public static void main(String[] args) {
int x = 5;
int y = 0;

if (x > 0) {
while (x > 0) {
y += x;
x--;
}
}

System.out.println(y);
}
}


#Tasks
👍2
Варианты ответа:
Anonymous Quiz
14%
5
5%
10
70%
15
11%
RuntimeException
👍1
Маленький, пушистый гайд по Cubernetes 🤓 🤣

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2