В Java мы можем объединить Случайный файл
и Файловый канал
для блокировки файла перед записью.
package com.mkyong; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.channels.FileLock; import java.util.concurrent.TimeUnit; public class LockFileAndWrite { public static void main(String[] args) { writeFileWithLock(new File("D:\\server.log"), "mkyong"); } public static void writeFileWithLock(File file, String content) { // auto close and release the lock try (RandomAccessFile reader = new RandomAccessFile(file, "rw"); FileLock lock = reader.getChannel().lock()) { // Simulate a 10s locked TimeUnit.SECONDS.sleep(10); reader.write(content.getBytes()); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } }
Пока файл заблокирован, попробуйте прочитать его в другом процессе:
try { Listlines = Files.readAllLines(Paths.get("D:\\server.log")); lines.forEach(x -> System.out.println(x)); } catch (IOException e) { e.printStackTrace(); }
Выход
java.io.IOException: The process cannot access the file because another process has locked a portion of the file at java.base/sun.nio.ch.FileDispatcherImpl.read0(Native Method) at java.base/sun.nio.ch.FileDispatcherImpl.read(FileDispatcherImpl.java:54) at java.base/sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:276) at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:245) at java.base/sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:223) at java.base/sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:65) at java.base/sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:109) at java.base/sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:103) at java.base/sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) at java.base/java.io.InputStreamReader.read(InputStreamReader.java:185) at java.base/java.io.BufferedReader.fill(BufferedReader.java:161) at java.base/java.io.BufferedReader.readLine(BufferedReader.java:326) at java.base/java.io.BufferedReader.readLine(BufferedReader.java:392) at java.base/java.nio.file.Files.readAllLines(Files.java:3405) at java.base/java.nio.file.Files.readAllLines(Files.java:3442) at com.mkyong.TestFile.main(TestFile.java:19)
Рекомендации
- JAVADOCS с произвольным доступом к файлам
- Файловые каналы JavaDocs
- Файлы Javadoc
- Как прочитать файл в Java – BufferedReader
Оригинал: “https://mkyong.com/java/java-how-to-lock-a-file-before-writing/”