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()
- 引用位置: