Большие файлы нельзя читать целиком в оперативной памяти, ведь она может закончиться. Вместо этого лучше читать файл чанками.
В этом посте:
• Создаём MessageDigest;
• Читаем файл;
• Получаем результат.
Такой подход используют для проверки целостности загрузок, поиска дубликатов и контроля файловых операций.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤6👍6🤝1
ArrayList это удобная коллекция для работы с динамическими списками в Java. На картинке собраны основные методы: от инициализации списка до сортировки, удаления и итерации элементов.Сохрани, чтобы всегда быть в курсе!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10🔥6👍4
Система плагинов!
Когда хочешь расширить функционал приложения без перекомпиляции, хорошо использовать плагины. В Java можно динамически загружать классы, используя ClassLoader.
Создаём интерфейс плагина:
Создаём класс плагина:
Реализуем кастомный ClassLoader для загрузки плагинов:
Загружаем плагин динамически:
Таким образом, можно добавлять новые плагины без перезапуска приложения и динамически загружать новые классы.
👉 Java Ready | #совет
Когда хочешь расширить функционал приложения без перекомпиляции, хорошо использовать плагины. В 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();Таким образом, можно добавлять новые плагины без перезапуска приложения и динамически загружать новые классы.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤5🔥4
Статья включает:
• Объяснения поэтапной миграция с монолита на микросервисы
Централизованное управление API запросами;
• Управление микросервисами с помощью сетевой инфраструктуры.
🔊 Читать статью на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍5🔥4
Реализация простого калькулятора!
Калькулятор это классическая задача для консольных приложений.
Создаём сканер для ввода данных и основные переменные:
Печатаем меню и принимаем ввод от пользователя:
Обрабатываем операцию через
Выводим результат и предлагаем продолжить или выйти:
🔥 Мы создали простой калькулятор с выбором операции и обработкой ошибок.
👉 Java Ready | #практика
Калькулятор это классическая задача для консольных приложений.
Создаём сканер для ввода данных и основные переменные:
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();
🔥 Мы создали простой калькулятор с выбором операции и обработкой ошибок.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6🔥6👍5
Многопоточная загрузка!
Когда нужно быстро скачать много файлов один поток превращает всё в очередь. Решение простое, грузить параллельно через пул потоков.
Создаём пул потоков:
Кидаем задачи на скачивание:
Дожидаемся завершения и закрываем пул:
Итог такой, что несколько загрузок идут одновременно.
👉 Java Ready | #совет
Когда нужно быстро скачать много файлов один поток превращает всё в очередь. Решение простое, грузить параллельно через пул потоков.
Создаём пул потоков:
ExecutorService pool = Executors.newFixedThreadPool(4);
Кидаем задачи на скачивание:
pool.submit(() -> download(url1));
pool.submit(() -> download(url2));
pool.submit(() -> download(url3));
Дожидаемся завершения и закрываем пул:
pool.shutdown();
pool.awaitTermination(1, TimeUnit.MINUTES);
Итог такой, что несколько загрузок идут одновременно.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤6🔥5
Делаем игру “Угадай число”
Компьютер загадывает число, а игрок пытается угадать, получая подсказки “больше/меньше”.
Задаём случайное число и готовим ввод с консоли:
Запускаем цикл попыток и читаем ответ игрока:
Сравниваем и даём подсказку “выше/ниже”:
Выводим победу и число попыток:
Получилась полноценная мини-игра, у нас выбирается случайное число и выводятся подсказки.
👉 Java Ready | #практика
Компьютер загадывает число, а игрок пытается угадать, получая подсказки “больше/меньше”.
Задаём случайное число и готовим ввод с консоли:
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();Получилась полноценная мини-игра, у нас выбирается случайное число и выводятся подсказки.
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
В этом ресурсе собраны ключевые темы, которые нужны в работе: базовые запросы, фильтрация, JOIN, группировки, подзапросы, индексы, транзакции и основы оптимизации. Всё объяснено простым языком и дополнено примерами с упражнениями.
Оставляю ссылочку: Github📱
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍5🔥5
Защита от зависаний!
Иногда код может зависнуть, сеть не отвечает, поток завис, задача не заканчивается. Чтобы приложение не висело вечно нужно ставить таймауты и принудительно обрывать долгие задачи.
Запускаем задачу в отдельном потоке:
Ждём ограниченное время:
Если не успело, отменяем задачу:
Так мы защищаемся от вечных зависаний процессов и вечных циклов.
👉 Java Ready | #совет
Иногда код может зависнуть, сеть не отвечает, поток завис, задача не заканчивается. Чтобы приложение не висело вечно нужно ставить таймауты и принудительно обрывать долгие задачи.
Запускаем задачу в отдельном потоке:
ExecutorService pool = Executors.newSingleThreadExecutor();
Future<String> task = pool.submit(() -> longWork());
Ждём ограниченное время:
String result = task.get(3, TimeUnit.SECONDS);
Если не успело, отменяем задачу:
task.cancel(true); // пытается прервать поток
pool.shutdownNow();
Так мы защищаемся от вечных зависаний процессов и вечных циклов.
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 использует 32-битные адреса, а IPv6 — 128-битные и поддерживает автоконфигурацию. Также на схеме показано, как работает Dual Stack и чем отличаются заголовки пакетов.
На картинке — ключевые различия IPv4 и IPv6, которые стоит держать под рукой.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍8🔥5
Система учёта задач!
To-Do это идеальная практика для списков, ввода и работы с файлами. Задачи будем хранить в
Задаём файл и загружаем задачи, если он уже существует:
Печатаем меню и читаем команду пользователя:
Выводим текущие задачи с нумерацией:
Добавляем задачу и сразу сохраняем в файл:
Удаляем задачу по номеру и сохраняем обновлённый список:
Выходим из программы и закрываем ввод:
В итоге получилась To-Do утилита с сохранением задач в tasks.txt.
👉 Java Ready | #практика
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.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍5🔥4
Модем отвечает за подключение к провайдеру и получение публичного IP, а роутер управляет локальной сетью: маршрутизирует трафик, выполняет NAT и раздаёт адреса устройствам.
На картинке — ключевые отличия и базовая схема работы.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤6🔥6
Защита от повторного запуска!
Иногда нельзя, чтобы приложение запускалось дважды. Решение простое, нужен lock-файл. Если он уже занят, значит экземпляр уже работает.
Путь к lock-файлу:
Открываем файл и пытаемся поставить блокировку:
Если
🔥 Теперь второй запуск не пройдёт, пока первый держит блокировку.
👉 Java Ready | #совет
Иногда нельзя, чтобы приложение запускалось дважды. Решение простое, нужен 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);
}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
1❤32🔥7👍5🤝1
Разделение PDF на страницы!
Когда PDF большой, удобнее разрезать его на отдельные страницы.
Подключаем библиотеку:
Открываем исходный
Режем на страницы и сохраняем:
Сохраняем каждую страницу отдельным файлом:
🔥 В итоге получаем
👉 Java Ready | #совет
Когда 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 и так далее. Удобно, когда нужно быстро раздать страницы.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍5🤝5
Например, когда домен вводится в браузере, он сначала проверяет кеш, если IP не найден — запускается цепочка DNS-запросов: Root - TLD - Authoritative сервер. В итоге браузер получает IP и только после этого отправляет HTTP-запрос на сервер.
На картинке — наглядная схема того, как именно работает DNS-резолв шаг за шагом.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤6🔥6🤝1
Генератор отчёта о размере файлов!
Иногда нужно быстро понять, что занимает место в директории.
Сделаем простой скрипт который пройдётся по файлам, получит размер каждого и сформирует отчёт.
Указываем папку для анализа и файл отчёта:
Создаём список строк, которые пойдут в отчёт:
Проходим по файлам и добавляем строки:
Сохраняем отчёт в файл и выводим путь:
🔥 В итоге появляется
👉 Java Ready | #практика
Иногда нужно быстро понять, что занимает место в директории.
Сделаем простой скрипт который пройдётся по файлам, получит размер каждого и сформирует отчёт.
Указываем папку для анализа и файл отчёта:
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 со списком файлов и их размером.Please open Telegram to view this post
VIEW IN TELEGRAM
❤8🔥7👍4
Java не имеет прямого
API для работы с Wi-Fi, но может запускать системные утилиты Windows и разбирать их вывод.В этом посте:
• Запускаем netsh;
• Считываем вывод консоли;
• Парсим SSID доступных Wi-Fi сетей.
Такой приём полезен для утилит, установщиков, и Java-приложений, которым нужно знать текущее Wi-Fi сети.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍5❤4