Справочник по C#

    Исходники по языку программирования CSharp

    Java – Как заблокировать файл перед записью

    /
    /
    /
    195 Views

    В Java мы можем комбинировать RandomAccessFile а также FileChannel заблокировать файл перед записью.

    LockFileAndWrite.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) {
    
    // автоматическое закрытие и снятие блокировки
    try (RandomAccessFile reader = new RandomAccessFile(file, "rw");
    FileLock lock = reader.getChannel().lock()) {
    
    // Имитация заблокированных 10 с
    TimeUnit.SECONDS.sleep(10);
    
    reader.write(content.getBytes());
    
    } catch (IOException | InterruptedException e) {
    e.printStackTrace();
    }
    
    }
    
    }
    

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

    
    try {
    List lines = 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.csharpcoderr.TestFile.main(TestFile.java:19)
    

    Рекомендации

    FileChannel io java блокировка Запись файла RandomAccessFile

    Java – Как заблокировать файл перед записью

    0.00 (0%) 0 votes

    moyadcode13
    • Facebook
    • Twitter
    • Google+
    • Linkedin
    • Pinterest