文件重命名功能无法正常工作

11

我想在JFileChooser选择的文件名后面添加一个扩展名,但是我无法让它正常工作。

这是代码:

final JFileChooser fc = new JFileChooser();
        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int returnVal = fc.showSaveDialog(null);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File f = fc.getSelectedFile();
            String name =f.getAbsoluteFile()+".txt";
            f.renameTo(new File(name));
            FileWriter fstream;
            try {
                fstream = new FileWriter(f);
                BufferedWriter out = new BufferedWriter(fstream);
                out.write("test one");
                out.close();
            } catch (IOException ex) {
                Logger.getLogger(AppCore.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

我搞不清楚为什么这不起作用。我还尝试过使用getPath()和getCanonicalPath(),但结果是一样的。该文件已创建在所选目录下,但没有".txt"扩展名。


1
你检查过renameTo的结果了吗?这是来自Java文档的内容:“无论此方法是否可以将文件从一个文件系统移动到另一个文件系统都取决于平台。应始终检查返回值以确保重命名操作成功。” - twain249
是的,它总是返回false。唯一一次它工作是当我手动设置新文件名但不包括路径:"test.txt"。这创建了一个包含“test one”的txt文件,但不在所选目录中。 - Giannis
你确定目标文件不存在吗? - Jon Skeet
是的。已经创建了一个新文件,但没有扩展名。我只是在桌面上进行测试,以便查看发生了什么。 - Giannis
你能否只使用 File f2 = new File(name); 来创建一个文件? - twain249
哈哈,是的,那真的起作用了...本来应该想到尝试一下的。 我猜我可以这样做,但你有什么猜测为什么renameTo不起作用吗? - Giannis
5个回答

9
我认为你想要做的只是更改所选择文件的名称,而不是在文件系统上重命名文件。在这种情况下,您不需要使用File.renameTo。您只需更改File。以下类似代码应该可以工作:
        File f = fc.getSelectedFile();
        String name = f.getAbsoluteFile()+".txt";
        f = new File(name);

File.renameTo 方法试图重命名文件系统上的文件。例如:

File oldFile = new File("test1.txt");
File newFile = new File("test2.txt");
boolean success = oldFile.renameTo(newFile); // renames test1.txt to test2.txt

在这三行代码之后,如果文件test1.txt成功重命名为test2.txt,则success将变为true;如果重命名失败(例如test1.txt不存在、被其他进程占用或未获得权限等),则success将变为false。我猜测你尝试重命名的文件夹而非文件(你正在使用带有DIRECTORIES_ONLY选项的JFileChooser)。如果该目录包含正在使用其中的文件或者在其中打开了命令提示符,那么它们将反对该目录被重命名。

1
是的,你说得对。我最终只是使用选择器中的名称(目录)创建了一个新文件。我之前认为renameTo可以在这种情况下使用。 - Giannis
在我的情况下,BufferedReader是打开的。因此文件无法重命名。 - Elidio Marquina

3
你还可以使用Google Guava库中的文件移动工具Files.move来重命名文件。这比编写自己的方法更容易。
从文档中可以看到:
移动文件从一个路径到另一个路径。此方法可以重命名文件或将其移动到不同的目录,就像Unix的mv命令一样。

2

如果您想重命名文件,则必须关闭所有对象(例如FileReader,FileWriter,FIS,FOS,即关闭读取文件对象,然后将其重命名)。


虽然这可能是解决问题的有价值提示,但回答确实需要比这更详细的解释。请编辑并提供示例代码以展示你的意思。或者,考虑将其编写为评论。 - Toby Speight

2

您正在向错误的文件写入。 当您调用renameTo时,当前文件的路径不会更改。 请尝试这样做:

final JFileChooser fc = new JFileChooser();
    fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    int returnVal = fc.showSaveDialog(null);
    if (returnVal == JFileChooser.APPROVE_OPTION) {
        File f = fc.getSelectedFile();
        String name =f.getAbsoluteFile()+".txt";
        File f2 = new File(name);
        f.renameTo(f2);
        FileWriter fstream;
        try {
            fstream = new FileWriter(f2);
            BufferedWriter out = new BufferedWriter(fstream);
            out.write("test one");
            out.close();
        } catch (IOException ex) {
            Logger.getLogger(AppCore.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

这并没有真正利用renameTo方法。虽然它能工作。 - Giannis

0
你需要创建一个新实例来引用文件的新名称。
oldFile = new File(newName);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接