文件renameTo不起作用

我试图添加一个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”扩展名。

在我看来,您要做的就是更改所选文件的名称 ,而不是重命名文件系统上的文件。 在这种情况下,您不使用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 ,则成功,如果重命名不成功则为false (例如, test1.txt不存在,在另一个进程中打开,权限被拒绝,等等。)

我会猜测你正在尝试重命名是因为你试图重命名一个目录(你正在使用带有DIRECTORIES_ONLY选项的JFileChooser )。 如果您有使用此目录中的文件的程序,或者在其中打开命令提示符,则它们将反对重命名此目录。

您还可以使用Google Guava库中的Files.move实用程序重命名文件。 它比编写自己的方法更容易。

来自文档:

将文件从一个路径移动到另一个路径。 此方法可以重命名文件或将其移动到其他目录,如Unix mv命令。

您正在写入错误的文件。 当您调用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); } } 

如果要重命名文件,则必须关闭所有对象(如FileReader,FileWriter,FIS,FOSmeans关闭读取文件对象,然后重命名)