gpt4 book ai didi

java - 复制文件时使用 FileLock

转载 作者:行者123 更新时间:2023-12-01 23:42:28 30 4
gpt4 key购买 nike

我试图通过 5 个不同的线程编辑一个 json 文件,然后将其复制 5 次,也到相同的目标路径。如您所见,存在并发问题。

我尝试了这个复制方法:

public static void copyFile(String originPath, String destinationPath, String file) throws IOException {
logger.debug("Starting copyFile of" + file);
FileChannel channel = null;
File lockFile = new File(originPath + file);
try {
logger.debug("Comienza el proceso de procesado del json del fichero:" + file);
channel = extracted(lockFile).getChannel();
FileLock fileLock = null;
try {
fileLock = channel.lock();
} catch(OverlappingFileLockException e) {
logger.error("3 "+e.getMessage());
Thread.sleep(200);
}

FileUtils.copyFile(FileUtils.getFile(originPath + file), FileUtils.getFile(destinationPath + file));
logger.debug("The copy of " + file + " ends.");
fileLock.release();
channel.close();
} catch (IOException e) {
logger.error("Failing to copy "+file " to " + destinationPath + e.getMessage());
}
}

我收到 null 和 IOException。我想要的是,当处理一个文件时,其他线程只是在队列中等待它,一个接一个。

最佳答案

如果我理解正确,你的问题是当你的一个线程尝试复制一个文件时,其他线程在队列中等待,然后一一开始工作。

您可以通过下面的代码实现这一点

public class FileLock {
static Semaphore semaphore = new Semaphore(1);

public static void copyFile(String originPath, String destinationPath, String file) throws IOException {
try {
semaphore.acquire();
logger.debug("Comienza el proceso de procesado del json del fichero:" + file);
FileUtils.copyFile(FileUtils.getFile(originPath + file), FileUtils.getFile(destinationPath + file));
logger.debug("The copy of " + file + " ends.");
} catch (IOException | InterruptedException e) {
logger.error("Failing to copy " + file" to " + destinationPath + e.getMessage());
} finally {
semaphore.release();
}
}
}

关于java - 复制文件时使用 FileLock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58253025/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com