This question already has answers here:
File.renameTo() fails
                                
                                    (5个答案)
                                
                        
                6年前关闭。
            
        

[编辑]我无法使用renameTo()类的File方法重命名我的文件。好吧,我搜索后发现一个问题,解释相同


  File.renameTo() fails?


我还阅读了renameTo()的Java文档,其中说:


  此方法的行为的许多方面本质上都依赖于平台:重命名操作可能无法将文件从一个文件系统移动到另一个文件系统,它可能不是原子的,并且如果目标抽象路径名的文件可能无法成功已经存在。应该始终检查返回值,以确保重命名操作成功。


好的,我知道renameTo()方法是依赖于平台的。

然后,我创建了FileOutputStream的对象并称为close()方法,现在我尝试了renameTo()方法,并且文件已重命名,

题:


我无法理解创建FileOutputStream对象后我的renameTo()方法起作用的原因?


环境:Windows XP,用户:管理员

码:

    File f = null;
    File f1 = null;
    boolean isFileRenamed = false;

    try {
        // create new File objects
        f = new File("C:\\originalFile.txt");
        f1 = new File("C:\\renamedFile.txt");

        // I need to write following code to rename the file
        // I tried without FileOutputStram object but then renameTo() did not work
        FileOutputStream fos = new FileOutputStream(f);
        fos.close();

        isFileRenamed = f.renameTo(f1);
        System.out.print("File renamed? " + isFileRenamed);

    } catch (Exception e) {
        e.printStackTrace();
    }


在创建FileOutputStram的对象后,搜索答案,为什么renameTo()方法有效。我的应用程序也使用Java1.6,因此Files类的选项已关闭。我将只需要使用renameTo()方法

最佳答案

这不是JDK中的错误。从the documentation


  此方法的行为的许多方面本质上都依赖于平台:重命名操作可能无法将文件从一个文件系统移动到另一个文件系统,它可能不是原子的,并且如果目标抽象路径名的文件可能无法成功已经存在。应该始终检查返回值,以确保重命名操作成功。


(我的重点)

不同的驱动器是不同的文件系统。在文件系统之间移动文件需要将文件的数据从旧文件系统复制到新文件,复制完成后,再在其原始位置删除文件。 renameTo不承担这项工作,这是在简单的情况下,文件可以简单地在文件系统中移动的情况。



您在下面说,它甚至在文件系统中也不起作用。请注意,如果使用Windows 7,则必须以管理员身份运行才能在C:驱动器的根目录中创建文件。

如果我以管理员身份在命令提示符下运行,这将起作用:

示例代码:

import java.io.*;

public class FileMove
{
    public static final void main(String[] args) {
        File f = null;
        File f1 = null;
        boolean bool = false;

        try {
            // create new File objects
            f = new File("C:\\test.txt");
            f1 = new File("C:\\renamed.txt");

            bool = f.renameTo(f1);

            System.out.print("File renamed? " + bool);

        } catch (Exception e) {
            // if any error occurs
            e.printStackTrace();
        }
    }
}


示例运行:

C:\> echo“ Testing 1 2 3”> test.txt
C:\>输入c:\ test.txt
“测试1 2 3”
C:\>输入c:\ renamed.txt
该系统找不到指定的文件。
C:\> java -cp。文件移动
文件已重命名?真正
C:\>键入更名的.txt
“测试1 2 3”
C:\>

但是正如millimoose在注释中指出的那样,存在Files.Move method

关于java - File.renameTo()失败,但是在创建FileOutputStream对象后可以工作,为什么? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17900500/

10-11 00:57