调用RandomAccessFile.close()时被锁定的文件

时间:2014-07-29 21:01:12

标签: java


我必须重命名一个文件。我首先尝试File.renameTo(File),但这种方法不起作用。该文件未在其他任何地方打开,无论是在我的程序中,还是在任何其他应用程序中。由于在文档中说这个函数非常依赖于系统,我的下一个方法是创建一个自定义方法。我尝试使用NIO,并使用以下方法:

public boolean renameFile(File from, File to)
{
    Path fromPath = from.toPath();
    Path toPath = to.toPath();
    try {
        Files.copy(fromPath, toPath, StandardCopyOption.REPLACE_EXISTING);
        Files.delete(fromPath);
    } catch (IOException ex) {
        return false;
    }
    return true;
}

我发现我不能这样做,因为当调用Files.delete(fromPath)时,文件仍然被锁定。我在StackOverfolw上搜索了一下这里找到的this question。解决方案是在循环中等待,直到文件不再被锁定。我试过了,但发现,在退出程序之前,文件从未解锁过。我做了一些研究,发现this。接受的答案是什么,这是known Bug that Oracle can't fix。评论提出了一种解决方法,避免使用NIO:

  

在这种情况下,我会使用Do-Not-Use-NIO解决方法。

我也试过了,结果是以下代码:

private boolean renameFile(File from, File to)
{
    FileInputStream fromIn = null;
    FileOutputStream toOut = null;
    try
    {
        fromIn = new FileInputStream(from);
        toOut = new FileOutputStream(to);
        byte[] buffer = new byte[ 0xFFFF ];
        for(int len; (len = fromIn.read(buffer)) != -1;)
        {
            toOut.write(buffer);
        }
    }
    catch(IOException ex){
    return false;}
    finally
    {
        if(fromIn != null)
        {
            try {fromIn.close();} catch (IOException ex) {}
        }
        if(toOut != null)
        {
            try {toOut.close();} catch (IOException ex) {}
        }
    }

    from.delete();

    return true;
}

再次,与我之前的尝试一样,所有文件都被复制到了他们的新位置,但from.delete();失败,因为他们被锁定 - 我甚至无法在资源管理器中删除它们。我还测试了流是否未能关闭。但是流正确关闭了。我试图找到更多的解决方案,但我找不到任何新的解决方案。如果有人有任何想法,将会感谢代码片段与解释。如果您知道另一个问题并且未在此处列出答案,欢迎加入。谢谢你的帮助!

GEF

0 个答案:

没有答案