0

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

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

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

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中的一个常见问题,但我找不到。

4

1 回答 1

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.ioAPI 将创建它。要在不创建的情况下打开文件进行写入,您可以使用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 
}
于 2013-08-21T15:54:20.693 回答