DirectoryLock.java

net.minecraft.util.DirectoryLock

信息

  • 全限定名:net.minecraft.util.DirectoryLock
  • 类型:public class
  • 包:net.minecraft.util
  • 源码路径:src/main/java/net/minecraft/util/DirectoryLock.java
  • 起始行号:L13
  • 实现:AutoCloseable
  • 职责:

    TODO

字段/常量

  • LOCK_FILE

    • 类型: String
    • 修饰符: public static final
    • 源码定位: L14
    • 说明:

      TODO

  • lockFile

    • 类型: FileChannel
    • 修饰符: private final
    • 源码定位: L15
    • 说明:

      TODO

  • lock

    • 类型: FileLock
    • 修饰符: private final
    • 源码定位: L16
    • 说明:

      TODO

  • DUMMY

    • 类型: ByteBuffer
    • 修饰符: private static final
    • 源码定位: L17
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.util.DirectoryLock.LockException
    • 类型: class
    • 修饰符: public static
    • 源码定位: L93
    • 说明:

      TODO

构造器

private DirectoryLock(FileChannel lockFile, FileLock lock) @ L44

  • 构造器名:DirectoryLock
  • 源码定位:L44
  • 修饰符:private

参数:

  • lockFile: FileChannel
  • lock: FileLock

说明:

TODO

方法

下面的方法块按源码顺序生成。

public static DirectoryLock create(Path dir) @ L19

  • 方法名:create
  • 源码定位:L19
  • 返回类型:DirectoryLock
  • 修饰符:public static

参数:

  • dir: Path

说明:

TODO

public void close() @ L49

  • 方法名:close
  • 源码定位:L49
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

public boolean isValid() @ L62

  • 方法名:isValid
  • 源码定位:L62
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public static boolean isLocked(Path dir) @ L66

  • 方法名:isLocked
  • 源码定位:L66
  • 返回类型:boolean
  • 修饰符:public static

参数:

  • dir: Path

说明:

TODO

代码

public class DirectoryLock implements AutoCloseable {
    public static final String LOCK_FILE = "session.lock";
    private final FileChannel lockFile;
    private final FileLock lock;
    private static final ByteBuffer DUMMY;
 
    public static DirectoryLock create(Path dir) throws IOException {
        Path lockPath = dir.resolve("session.lock");
        FileUtil.createDirectoriesSafe(dir);
        FileChannel lockFile = FileChannel.open(lockPath, StandardOpenOption.CREATE, StandardOpenOption.WRITE);
 
        try {
            lockFile.write(DUMMY.duplicate());
            lockFile.force(true);
            FileLock lock = lockFile.tryLock();
            if (lock == null) {
                throw DirectoryLock.LockException.alreadyLocked(lockPath);
            } else {
                return new DirectoryLock(lockFile, lock);
            }
        } catch (IOException var6) {
            try {
                lockFile.close();
            } catch (IOException var5) {
                var6.addSuppressed(var5);
            }
 
            throw var6;
        }
    }
 
    private DirectoryLock(FileChannel lockFile, FileLock lock) {
        this.lockFile = lockFile;
        this.lock = lock;
    }
 
    @Override
    public void close() throws IOException {
        try {
            if (this.lock.isValid()) {
                this.lock.release();
            }
        } finally {
            if (this.lockFile.isOpen()) {
                this.lockFile.close();
            }
        }
    }
 
    public boolean isValid() {
        return this.lock.isValid();
    }
 
    public static boolean isLocked(Path dir) throws IOException {
        Path lockPath = dir.resolve("session.lock");
 
        try {
            boolean var4;
            try (
                FileChannel lockFile = FileChannel.open(lockPath, StandardOpenOption.WRITE);
                FileLock maybeLock = lockFile.tryLock();
            ) {
                var4 = maybeLock == null;
            }
 
            return var4;
        } catch (AccessDeniedException var10) {
            return true;
        } catch (NoSuchFileException var11) {
            return false;
        }
    }
 
    static {
        byte[] chars = "\u2603".getBytes(StandardCharsets.UTF_8);
        DUMMY = ByteBuffer.allocateDirect(chars.length);
        DUMMY.put(chars);
        DUMMY.flip();
    }
 
    public static class LockException extends IOException {
        private LockException(Path path, String message) {
            super(path.toAbsolutePath() + ": " + message);
        }
 
        public static DirectoryLock.LockException alreadyLocked(Path path) {
            return new DirectoryLock.LockException(path, "already locked (possibly by other Minecraft instance?)");
        }
    }
}

引用的其他类

  • FileUtil
    • 引用位置: 方法调用
    • 关联成员: FileUtil.createDirectoriesSafe()