Java for Beginner
675 subscribers
546 photos
155 videos
12 files
838 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
Что выведет код?

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
Варианты ответа:
Anonymous Quiz
38%
А 1
3%
В 2
45%
С 3
15%
Ничегошеньки
А он просто покурить вышел... 😂

https://t.me/Java_for_beginner_dev

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

Какой блок используется для обработки исключений?
Anonymous Quiz
89%
try-catch
11%
if-else
0%
for
0%
while
Запуск внешних процессов и чтение вывода. Подробности о классе 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
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
This media is not supported in your browser
VIEW IN TELEGRAM
Всем доброго субботнего утра! ☀️

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

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

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

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

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

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

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

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

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

https://t.me/Java_for_beginner_dev

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

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

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

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

Но увижу все тех же 🤪
Please open Telegram to view this post
VIEW IN TELEGRAM
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
Встреча создана!
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
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Класс 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
Что выведет код?

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
Варианты ответа:
Anonymous Quiz
14%
5
5%
10
70%
15
11%
RuntimeException
Маленький, пушистый гайд по Cubernetes 🤓 🤣

https://t.me/Java_for_beginner_dev

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