gpt4 book ai didi

java - 如果使用文件则暂停 Java 的执行

转载 作者:行者123 更新时间:2023-12-01 14:12:55 26 4
gpt4 key购买 nike

我的应用程序写入 Excel 文件。有时文件可以使用,这时抛出FileNotFoundException,然后我不知道如何更好地处理它。

我告诉用户该文件已被使用,在该消息之后我不想关闭应用程序,而是在文件可​​用时停止并等待(假设它是由同一用户打开的)。但我不明白如何实现它。 file.canWrite() 不起作用,即使打开文件它也会返回 true,要使用 FileLock 并检查锁是否可用,我需要打开一个流,但它会抛出 FileNotFoundException (我一直在考虑检查锁定忙等待,我知道这不是一个好的解决方案,但我找不到另一个解决方案)。

这是我的代码的一部分,如果它可以帮助理解我的问题:

File file = new File(filename);
FileOutputStream out = null;
try {
out = new FileOutputStream(file);
FileChannel channel = out.getChannel();
FileLock lock = channel.lock();
if (lock == null) {
new Message("lock not available");
// to stop the program here and wait when the file is available, then resume
}
// write here
lock.release();
}
catch (IOException e) {
new Message("Blocked");
// or to stop here and then create another stream when the file is available
}

对我来说更困难的是它写入不同的文件,如果第一个文件可用,但第二个文件不可用,那么它将更新一个文件,然后停止,如果我重新启动程序,它将再次更新它,所以我不能允许程序写入文件,直到所有文件都可用。

我相信应该有一个通用的解决方案,因为它一定是Windows中处理此类情况的常见问题,但我找不到它。

最佳答案

要等待文件存在,您可以创建一个简单的循环:

File file = new File(filename);
while (!file.exists()) {
try {
Thread.sleep(100);
} catch (InterruptedException ie) { /* safe to ignore */ }
}

更好的解决方案可能是使用 WatchService但需要实现更多代码。

File.canWrite 方法仅告诉您是否可以写入路径;如果路径命名的文件不存在,它将返回false。您可以在上面的循环中使用 canRead 方法而不是 exists

要使用文件锁,文件必须首先存在,因此这也不起作用。

<小时/>

确保可以写入文件的唯一方法是尝试打开它。如果该文件不存在,java.io API 将创建它。要打开文件进行写入而不创建,您可以使用 java.nio.file.Files类:

try (OutputStream out = Files.newOutputStream(file.toPath(),
StandardOpenOption.WRITE))
{
// exists and is writable
} catch (IOException) {
// doesn't exist or can't be opened for writing
}

关于java - 如果使用文件则暂停 Java 的执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18362030/

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