FileLock из java.nio.channels — это инструмент для предотвращения одновременного изменения файла несколькими процессами или потоками. Если ваше приложение работает с общими файлами, FileLock помогает избежать конфликтов. 🔍 Что нужно знать о FileLock?
1️⃣ Поддерживает эксклюзивные и разделяемые блокировки.
2️⃣ Может работать с любыми типами файлов: текстовыми, бинарными и т.д.
3️⃣ Совместим с каналами
FileChannel. 📌 Пример использования FileLock:
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
public class FileLockExample {
public static void main(String[] args) {
try (RandomAccessFile file = new RandomAccessFile("example.txt", "rw");
FileChannel channel = file.getChannel()) {
// Устанавливаем блокировку
FileLock lock = channel.lock();
System.out.println("Файл заблокирован.");
// Выполняем операции
file.writeBytes("Добавляем данные, пока файл заблокирован...\n");
// Освобождаем блокировку
lock.release();
System.out.println("Файл разблокирован.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
🔗 Ключевые особенности:
1️⃣ Эксклюзивная блокировка:
channel.lock() — блокирует файл для всех, кроме текущего процесса. 2️⃣ Разделяемая блокировка:
channel.lock(start, size, true) — доступна только для чтения. 3️⃣ Блокировки не являются межпотоковыми; они работают на уровне процесса.
✨ Когда использовать?
- Для работы с общими ресурсами в распределённых приложениях.
- Для предотвращения одновременной записи в файл несколькими процессами.
- Для контроля доступа к критически важным данным.
💡 Совет: Всегда освобождайте блокировку (
lock.release()), чтобы другие процессы могли получить доступ к файлу. #Java #FileLock #nio
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤2
WatchService из java.nio.file — это инструмент для отслеживания изменений в файловой системе. С его помощью можно отслеживать создание, изменение и удаление файлов или папок в указанном каталоге. 🔍 Почему WatchService?
1️⃣ Лёгкий способ мониторинга изменений без ручных проверок.
2️⃣ Эффективно работает в реальном времени.
3️⃣ Удобно для отслеживания логов, конфигурационных файлов или загрузок.
📌 Пример использования:
import java.io.IOException;
import java.nio.file.*;
public class WatchServiceExample {
public static void main(String[] args) throws IOException, InterruptedException {
Path path = Paths.get("watched_directory");
// Создаём WatchService
try (WatchService watchService = FileSystems.getDefault().newWatchService()) {
// Регистрируем каталог для мониторинга
path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_MODIFY,
StandardWatchEventKinds.ENTRY_DELETE);
System.out.println("Мониторинг изменений в каталоге: " + path);
while (true) {
WatchKey key = watchService.take(); // Блокирует поток до события
for (WatchEvent<?> event : key.pollEvents()) {
WatchEvent.Kind<?> kind = event.kind();
Path fileName = (Path) event.context();
System.out.println("Событие: " + kind + " для файла: " + fileName);
}
// Сбрасываем ключ, чтобы продолжать мониторинг
boolean valid = key.reset();
if (!valid) {
break; // Если ключ недействителен, выходим из цикла
}
}
}
}
}
🔗 Как это работает:
1️⃣ Регистрируйте каталог с указанием типов событий (
ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE). 2️⃣ Обрабатывайте события через
WatchKey и список pollEvents(). 3️⃣ Вызывайте
key.reset() после обработки событий, чтобы продолжить мониторинг. 💡 Совет: Убедитесь, что ваш код учитывает, что
WatchService отслеживает только верхний уровень каталога (не вложенные папки). #Java #WatchService #nio
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Memory-mapped buffer — это механизм, предоставляемый Java NIO, который позволяет отображать файл в памяти, так что его содержимое становится доступным для чтения и записи как массив байтов. Это позволяет работать с файлами напрямую через память, что часто значительно увеличивает производительность операций ввода-вывода (I/O).
🔍 Почему это быстрее?
1️⃣ Файл загружается в память через виртуальную память ОС.
2️⃣ Операции чтения/записи проходят без необходимости копирования данных между потоками.
3️⃣ Доступ к данным осуществляется так же, как и в обычном массиве.
📌 Пример чтения файла:
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public class MemoryMappedBufferExample {
public static void main(String[] args) throws IOException {
try (RandomAccessFile file = new RandomAccessFile("example.txt", "r");
FileChannel channel = file.getChannel()) {
// Сопоставляем файл с памятью
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
// Читаем данные из буфера
for (int i = 0; i < buffer.limit(); i++) {
System.out.print((char) buffer.get());
}
}
}
}
🔗 Ключевые моменты:
1️⃣ Режимы
READ_ONLY, READ_WRITE, PRIVATE определяют доступ к файлу. 2️⃣ Объём сопоставления ограничен размером доступной памяти.
3️⃣ Подходит для работы с большими файлами (до гигабайтов).
✨ Когда использовать?
- Для высокопроизводительного чтения/записи данных.
- При обработке больших логов или бинарных файлов.
- Когда нужно работать с файлами как с массивами.
#Java #MemoryMappedBuffer #nio
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤1🕊1