我的应用程序写入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中处理此类情况的常见问题,但我找不到它。
答案 0 :(得分:1)
要等到文件存在,您可以进行简单的循环:
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
}