2012-04-01 94 views
6

我想添加一个扩展名到JFileChooser所选的文件名,尽管我无法让它工作。文件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"; 
      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 2012-04-01 18:04:01

+0

是它始终返回false。唯一的工作是当我手动设置新的文件名但不包括路径:“test.txt”。创建了一个包含“test one”但不在选定目录的txt – Giannis 2012-04-01 18:05:42

+0

你确定目标文件不存在? – 2012-04-01 18:06:54

回答

2

在我看来,所有你想要做的是改变名称选择的文件中,而不是重命名文件系统中的文件。在这种情况下,您不要使用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 

这三条线之后,successtrue如果文件test1.txt可能被重命名为test2.txt,并false,如果重命名不成功(如test1.txt不存在,是在另一个进程中打开,权限被拒绝等)

我将冒险猜测您尝试重命名失败,因为您正尝试重命名目录(您正在使用JFileChooserDIRECTORIES_ONLY选项)。如果您有使用此目录中的文件的程序或其中打开的命令提示符,它们将反对重命名此目录。

+0

是的,你是对的我最终只是使用Chooser的名称(目录)创建一个新的文件。我只是认为renameTo是一个可以在这种情况下使用的操作。 – Giannis 2012-04-02 09:23:52

+0

在我的情况下,BufferedReader是打开的。由于这个原因该文件不能被重命名。 – ELD 2015-05-21 00:29:23

0

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

那么这并没有真正使用renameTo方法。虽然它有效。 – Giannis 2012-04-01 18:13:03

1

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

从文档:

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

0

如果要重命名的文件再有就是一定要关闭所有的物品(如的FileReader,FileWriter的,FIS,FOSmeans关闭读取文件对象,然后将其重命名

+0

虽然这可能是解决问题的有价值的提示,但 的答案确实需要比这更详细的一点。请提供 [编辑]以提供示例代码来展示您的意思。 或者,请考虑将其写为注释。 – 2016-06-08 21:55:26