如果使用文件,则暂停执行Java

时间:2013-08-21 15:46:37

标签: java locking java-io filenotfoundexception

我的应用程序写入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中处理此类情况的常见问题,但我找不到它。

1 个答案:

答案 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 
}