2012-04-01 64 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