java file.renameTo()在unix中失败

时间:2013-04-09 15:51:01

标签: java unix java-6 file-rename

我有一个处理文件内容的j​​ava应用程序,然后我需要将它移动到另一个位置。

这是我阅读文件的方式:

    String filePath = new String("foo.bar");
    String fileContents = new String("");
    char[] myBuffer = new char[chunkSize];
    int bytesRead = 0;
    BufferedReader in;
    try {
        FileReader fr = new FileReader(filePath);
        in = new BufferedReader(fr);
        try {
            while ((bytesRead = in.read(myBuffer,0,chunkSize)) != -1)
            {
                //System.out.println("Read " + bytesRead + " bytes. They were: " + new String(myBuffer));
                fileContents+= new String(myBuffer).substring(0, bytesRead);
            }
            // close the stream as I don't need it anymore. (If I don't close it, then java would hold the file open thus preventing the subsequent move of the file)
            in.close();
            fr.close();
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        return null;
    }

当关闭输入流和文件阅读器时,应该关闭文件。

然后我尝试使用File.renameTo(newFileName);将文件移动到另一个目录但是这失败了(在unix下,在windows下工作正常)

移动失败后,我测试是否可以创建名为newFileName的文件以及是否可以删除原始文件。将创建新文件,而原始文件无法删除。 有趣的是,我可以在应用程序运行时(在失败后立即)从命令行删除原始文件。

知道为什么会这样或者任何其他选择?

更多细节:我在unix下工作,因为遗留原因我必然会使用java 1.6(因此我无法恢复到从java 1.7开始支持的Files.move())。

2 个答案:

答案 0 :(得分:1)

我发现我的java应用程序中存在什么问题。

基本上,我使用自定义FileFilter从目录中提取文件列表。这给了我一个数组File[] foundFiles。 之后我做的是使用问题中的代码片段在while循环中读取每个文件。 在因某种原因读取文件后,我使用数组中的第i个文件作为构造函数的参数创建了一个新的File对象

File file = new File(foundFiles[i].getName()); // File to be moved

然后我尝试重命名这个。

现在出于某种原因,这可以在windows下工作,而不是在unix下(文件以某种方式锁定,我认为是foundFiles[i]对象)。

事实上,如果我打印这些行的结果

System.out.println("I can read foundFiles[i]: " +foundFiles[i].canRead());// DEBUG
System.out.println("I can write foundFiles[i]: " +foundFiles[i].canWrite());// DEBUG
System.out.println("I can read file : " +file.canRead());// DEBUG
System.out.println("I can write file : " +file.canWrite());// DEBUG

我得到了

I can read foundFiles[i]: True
I can write foundFiles[i]: True
I can read file: False
I can write file: False

直接在renameTo()对象上使用foundFiles[i]就可以使其正常工作了。

希望这会有所帮助,但我不知道为什么第一个版本可以在Windows下运行而不是在unix下运行。

答案 1 :(得分:0)

让我们分析一下上述观察结果......

I can read foundFiles[i]: True
I can write foundFiles[i]: True
I can read file: False
I can write file: False

结果是正常的,因为 文件 对象是通过 新文件(foundFiles [i] .getName())生成的 ,但方法 getName 仅提供文件名,不包含文件路径!

通过 新文件(foundFiles [i] .getParent()+ File.separator + foundFiles [i] .getName()) 创建文件,结果那就是:

I can read foundFiles[i]: True
I can write foundFiles[i]: True
I can read file: True
I can write file: True