File.renameTo()失败但在创建FileOutputStream对象后工作,为什么?

0 java file

[编辑]我无法用类的renameTo()方法重命名我的文件File.好的,我搜索并找到了解释相同的问题

File.renameTo()失败了吗?

我还阅读了Java Doc,renameTo()其中说:

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

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

然后我创建了对象FileOutputStream和调用close()方法,现在我尝试了renameTo()方法,我的文件被重命名,

题:

  • 创建FileOutputStreamrenameTo()方法的对象后,我无法理解为什么会这样做?

环境: 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();
    }
Run Code Online (Sandbox Code Playgroud)

在创建对象后搜索renameTo()方法工作原理的答案FileOutputStram.我的应用程序也使用Java1.6,因此我的Files类选项已关闭.我将只能使用renameTo()方法

T.J*_*der 5

这不是JDK中的错误.从文档:

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

(我的重点)

不同的驱动器是不同的文件系统 在文件系统之间移动文件需要文件的数据从旧文件系统复制到新文件系统,并在复制完成后将文件删除到原始位置.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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

示例运行:

C:\>echo "Testing 1 2 3">test.txt
C:\>type c:\test.txt
"Testing 1 2 3"
C:\>type c:\renamed.txt
The system cannot find the file specified.
C:\>java -cp . FileMove
File renamed? true
C:\>type renamed.txt
"Testing 1 2 3"
C:\>

但正如millimoose在评论中指出的那样,有Files.Move方法.