Java Ready | Программирование
8.9K subscribers
1.22K photos
60 videos
1 file
600 links
Авторский канал по разработке на Java.
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!

Автор: @energy_it

Реклама на бирже: https://telega.in/c/java_ready
Download Telegram
📂 Напоминалка по ArrayList!

ArrayList это удобная коллекция для работы с динамическими списками в Java. На картинке собраны основные методы: от инициализации списка до сортировки, удаления и итерации элементов.

Сохрани, чтобы всегда быть в курсе!

👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
10🔥6👍4
Система плагинов!

Когда хочешь расширить функционал приложения без перекомпиляции, хорошо использовать плагины. В Java можно динамически загружать классы, используя ClassLoader.

Создаём интерфейс плагина:
public interface Plugin {
void execute();
}


Создаём класс плагина:
public class MyPlugin implements Plugin {
@Override
public void execute() {
System.out.println("Плагин загружен!");
}
}


Реализуем кастомный ClassLoader для загрузки плагинов:
public class PluginClassLoader extends ClassLoader {
private final Path dir;

public PluginClassLoader(Path dir) {
this.dir = dir;
}

@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
Path file = dir.resolve(name.replace('.', '/') + ".class");
byte[] bytes = Files.readAllBytes(file);
return defineClass(name, bytes, 0, bytes.length);
} catch (IOException e) {
throw new ClassNotFoundException(name, e);
}
}
}


Загружаем плагин динамически:
Path pluginDir = Path.of("plugins");
PluginClassLoader loader = new PluginClassLoader(pluginDir);
Class<?> pluginClass = loader.loadClass("MyPlugin");
Plugin plugin = (Plugin) pluginClass.getDeclaredConstructor().newInstance();
plugin.execute();


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

👉 Java Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍65🔥4
✍️ Основные паттерны микросервисной архитектуры!

Статья включает:
• Объяснения поэтапной миграция с монолита на микросервисы
Централизованное управление API запросами;
• Управление микросервисами с помощью сетевой инфраструктуры.

🔊 Читать статью на Habr!


👉 Java Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍5🔥4
Реализация простого калькулятора!

Калькулятор это классическая задача для консольных приложений.

Создаём сканер для ввода данных и основные переменные:
var sc = new java.util.Scanner(System.in);
boolean run = true;


Печатаем меню и принимаем ввод от пользователя:
while (run) {
System.out.println("Введите первое число:");
double num1 = sc.nextDouble();

System.out.println("Выберите операцию (+, -, *, /):");
String operator = sc.next();

System.out.println("Введите второе число:");
double num2 = sc.nextDouble();


Обрабатываем операцию через switch:
    double result = 0;
switch (operator) {
case "+" -> result = num1 + num2;
case "-" -> result = num1 - num2;
case "*" -> result = num1 * num2;
case "/" -> {
if (num2 != 0) {
result = num1 / num2;
} else {
System.out.println("Ошибка: деление на ноль");
continue;
}
}
default -> System.out.println("Неверная операция");
}


Выводим результат и предлагаем продолжить или выйти:
    System.out.println("Результат: " + result);
System.out.println("Хотите продолжить? (да/нет)");
String answer = sc.next();
if (answer.equalsIgnoreCase("нет")) {
run = false;
}
}
sc.close();


🔥 Мы создали простой калькулятор с выбором операции и обработкой ошибок.

👉 Java Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥6👍5
Многопоточная загрузка!

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

Создаём пул потоков:
ExecutorService pool = Executors.newFixedThreadPool(4);


Кидаем задачи на скачивание:
pool.submit(() -> download(url1));
pool.submit(() -> download(url2));
pool.submit(() -> download(url3));


Дожидаемся завершения и закрываем пул:
pool.shutdown();
pool.awaitTermination(1, TimeUnit.MINUTES);


Итог такой, что несколько загрузок идут одновременно.

👉 Java Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍106🔥5
Делаем игру “Угадай число”

Компьютер загадывает число, а игрок пытается угадать, получая подсказки “больше/меньше”.

Задаём случайное число и готовим ввод с консоли:
var rnd = new java.util.Random();
int secret = rnd.nextInt(100) + 1; // 1..100
var sc = new java.util.Scanner(System.in);
int tries = 0;


Запускаем цикл попыток и читаем ответ игрока:
while (true) {
System.out.print("Введите число 1..100: ");
int guess = sc.nextInt();
tries++;


Сравниваем и даём подсказку “выше/ниже”:
    if (guess < secret) System.out.println("Больше!");
else if (guess > secret) System.out.println("Меньше!");
else break;
}


Выводим победу и число попыток:
System.out.println("Угадал! Число: " + secret);
System.out.println("Попыток: " + tries);
sc.close();


Получилась полноценная мини-игра, у нас выбирается случайное число и выводятся подсказки.

👉 Java Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍7🔥4🤝2
This media is not supported in your browser
VIEW IN TELEGRAM
😎 SQL-101 — руководство, помогающее освоить язык и укрепить базу тем, кто уже работает с БД.

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

Оставляю ссылочку: Github 📱


👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍5🔥5
Защита от зависаний!

Иногда код может зависнуть, сеть не отвечает, поток завис, задача не заканчивается. Чтобы приложение не висело вечно нужно ставить таймауты и принудительно обрывать долгие задачи.

Запускаем задачу в отдельном потоке:
ExecutorService pool = Executors.newSingleThreadExecutor();
Future<String> task = pool.submit(() -> longWork());


Ждём ограниченное время:
String result = task.get(3, TimeUnit.SECONDS);


Если не успело, отменяем задачу:
task.cancel(true); // пытается прервать поток
pool.shutdownNow();


Так мы защищаемся от вечных зависаний процессов и вечных циклов.

👉 Java Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
5🔥5👍4
This media is not supported in your browser
VIEW IN TELEGRAM
📂 Напоминалка по IPv4 vs IPv6!

Например, IPv4 использует 32-битные адреса, а IPv6 — 128-битные и поддерживает автоконфигурацию. Также на схеме показано, как работает Dual Stack и чем отличаются заголовки пакетов.

На картинке — ключевые различия IPv4 и IPv6, которые стоит держать под рукой.

Сохрани, чтобы не забыть!

👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍8🔥5
Система учёта задач!

To-Do это идеальная практика для списков, ввода и работы с файлами. Задачи будем хранить в ArrayList, а между запусками сохранять в tasks.txt.

Задаём файл и загружаем задачи, если он уже существует:
var path = java.nio.file.Path.of("tasks.txt");
var tasks = new java.util.ArrayList<String>();

if (java.nio.file.Files.exists(path))
tasks.addAll(java.nio.file.Files.readAllLines(path));


Печатаем меню и читаем команду пользователя:
var sc = new java.util.Scanner(System.in);
boolean run = true;

while (run) {
System.out.println("1) Список 2) Добавить 3) Удалить 0) Выход");
System.out.print("Выбор: ");
var cmd = sc.nextLine().trim();


Выводим текущие задачи с нумерацией:
    if (cmd.equals("1")) {
if (tasks.isEmpty()) System.out.println("Задач нет.");
for (int i = 0; i < tasks.size(); i++)
System.out.println((i + 1) + ") " + tasks.get(i));
}


Добавляем задачу и сразу сохраняем в файл:
    else if (cmd.equals("2")) {
System.out.print("Текст задачи: ");
var t = sc.nextLine();
tasks.add(t);
java.nio.file.Files.write(path, tasks);
System.out.println("Добавлено.");
}


Удаляем задачу по номеру и сохраняем обновлённый список:
    else if (cmd.equals("3")) {
System.out.print("Номер: ");
int n = Integer.parseInt(sc.nextLine());
if (n >= 1 && n <= tasks.size()) {
tasks.remove(n - 1);
java.nio.file.Files.write(path, tasks);
System.out.println("Удалено.");
} else System.out.println("Неверный номер.");
}


Выходим из программы и закрываем ввод:
    else if (cmd.equals("0")) run = false;
else System.out.println("Неизвестная команда.");

System.out.println();
}
sc.close();


В итоге получилась To-Do утилита с сохранением задач в tasks.txt.

👉 Java Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍5🔥4
📂 Напоминалка про Modem vs Router!

Модем отвечает за подключение к провайдеру и получение публичного IP, а роутер управляет локальной сетью: маршрутизирует трафик, выполняет NAT и раздаёт адреса устройствам.

На картинке — ключевые отличия и базовая схема работы.

Сохрани, чтобы не забыть!

👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍86🔥6
Защита от повторного запуска!

Иногда нельзя, чтобы приложение запускалось дважды. Решение простое, нужен lock-файл. Если он уже занят, значит экземпляр уже работает.

Путь к lock-файлу:
Path lockPath = Path.of("app.lock");


Открываем файл и пытаемся поставить блокировку:
FileChannel channel = FileChannel.open(lockPath,
StandardOpenOption.CREATE, StandardOpenOption.WRITE);

FileLock lock = channel.tryLock();


Если lock не получен выходим:
if (lock == null) {
System.out.println("Экземпляр уже запущен — выходим");
System.exit(1);
}


🔥 Теперь второй запуск не пройдёт, пока первый держит блокировку.

👉 Java Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍5🔥4
🎄 Джависты, всех с наступающим!

Желаю каждому провести новый 2026 год намного лучше и выполнить все планы. Моя цель: набрать более 15 тысяч подписчиков.
Please open Telegram to view this post
VIEW IN TELEGRAM
132🔥7👍5🤝1
Разделение PDF на страницы!

Когда PDF большой, удобнее разрезать его на отдельные страницы.

Подключаем библиотеку:
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.31</version>
</dependency>


Открываем исходный PDF:
PDDocument doc = PDDocument.load(new File("input.pdf"));


Режем на страницы и сохраняем:
Splitter splitter = new Splitter();
List<PDDocument> pages = splitter.split(doc);


Сохраняем каждую страницу отдельным файлом:
int i = 1;
for (PDDocument page : pages) {
page.save("page-" + i + ".pdf");
page.close();
i++;
}
doc.close();


🔥 В итоге получаем page-1.pdf, page-2.pdf, page-3.pdf и так далее. Удобно, когда нужно быстро раздать страницы.

👉 Java Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍5🤝5
📂 Напоминалка по DNS!

Например, когда домен вводится в браузере, он сначала проверяет кеш, если IP не найден — запускается цепочка DNS-запросов: Root - TLD - Authoritative сервер. В итоге браузер получает IP и только после этого отправляет HTTP-запрос на сервер.

На картинке — наглядная схема того, как именно работает DNS-резолв шаг за шагом.

Сохрани, чтобы не забыть!

👉 Java Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍106🔥6🤝1
Генератор отчёта о размере файлов!

Иногда нужно быстро понять, что занимает место в директории.
Сделаем простой скрипт который пройдётся по файлам, получит размер каждого и сформирует отчёт.

Указываем папку для анализа и файл отчёта:
var dir = java.nio.file.Path.of("logs");
var report = java.nio.file.Path.of("report.txt");


Создаём список строк, которые пойдут в отчёт:
var lines = new java.util.ArrayList<String>();
lines.add("Отчёт по папке: " + dir.toAbsolutePath());
lines.add("");


Проходим по файлам и добавляем строки:
try (var s = java.nio.file.Files.list(dir)) {
s.filter(java.nio.file.Files::isRegularFile).forEach(p -> {
try {
long size = java.nio.file.Files.size(p);
lines.add(p.getFileName() + " → " + size + " bytes");
} catch (Exception e) {
lines.add(p.getFileName() + " → ошибка чтения");
}
});
}


Сохраняем отчёт в файл и выводим путь:
java.nio.file.Files.write(report, lines);
System.out.println("Готово: " + report.toAbsolutePath());


🔥 В итоге появляется report.txt со списком файлов и их размером.

👉 Java Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
8🔥7👍4
👩‍💻 Парсим Wi-Fi сети в Windows!

Java не имеет прямого API для работы с Wi-Fi, но может запускать системные утилиты Windows и разбирать их вывод.

В этом посте:
• Запускаем netsh;

• Считываем вывод консоли;

• Парсим SSID доступных Wi-Fi сетей.


Такой приём полезен для утилит, установщиков, и Java-приложений, которым нужно знать текущее Wi-Fi сети.

👉 Java Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍54