2011-02-17 28 views
1

這是我第一次在這個偉大的頁面上提問,所以如果我犯了錯誤,請耐心等待。 我想要做的是在我更改後在我的用戶目錄中創建一個具有相對路徑的新文件。要更改我使用的用戶目錄System.setProperty("user.dir", "/data");,然後我創建了一個文件對象File f2 = new File("f2");並使用f2.createNewFile();在我的文件系統上創建了空文件。在此之後,我預計該文件將出現在/ data/f2中,這就是f2.getAbsolutePath()告訴我的。但令人困惑的是,該文件出現在「舊的,初始的」userDir中。更改「user.dir」後,相對路徑的File.createNewFile()使用錯誤的目錄 - 屬性

這裏是我的測試:

import java.io.File; 
import java.io.FilenameFilter; 
import java.io.IOException; 

public class Main { 

    private static FilenameFilter filter = new FilenameFilter() { 

     public boolean accept(File dir, String name) { 
      return (name.startsWith("f")) ? true : false; 
     } 
    }; 

    public static void main(String[] args) throws IOException { 
     String userDirPropertyName = "user.dir"; 
     File initialUserDir = new File(System.getProperty(userDirPropertyName)); 

     System.out.println("files in " + initialUserDir.getAbsolutePath() + ":"); 
     for (File file : initialUserDir.listFiles(filter)) { 
      System.out.println(" - " + file.getAbsoluteFile()); 
     } 

     System.out.println("initial userDir = " + System.getProperty(userDirPropertyName)); 
     File f1 = new File("f1"); 
     f1.createNewFile(); 
     System.out.println("f1.getAbsolutePath() = " + f1.getAbsolutePath()); 
     System.out.println("getCanonicalPath() for . = " + new File(".").getCanonicalPath()); 


     System.setProperty(userDirPropertyName, "/data"); 

     System.out.println("changed userDir = " + System.getProperty(userDirPropertyName)); 
     File f2 = new File("f2"); 
     f2.createNewFile(); 
     System.out.println("f2.getAbsolutePath() = " + f2.getAbsolutePath()); 
     System.out.println("getCanonicalPath() for . = " + new File(".").getCanonicalPath()); 


     System.out.println("files in " + initialUserDir.getAbsolutePath() + ":"); 
     for (File file : initialUserDir.listFiles(filter)) { 
      System.out.println(" - " + file.getAbsoluteFile()); 
     } 
    } 
} 

這個輸出,我得到:

文件到/ home/PPS /的NetBeansProjects/UserDirTest:
初始USERDIR = /家庭/ PPS/NetBeansProjects/UserDirTest
f1.getAbsolutePath()=/home/pps/NetBeansProjects/UserDirTest/f1
getCanonicalPath()for。 = /家庭/ PPS /的NetBeansProjects/UserDirTest
改變USERDIR = /數據
f2.getAbsolutePath()= /數據/ F2
getCanonicalPath()進行。 = /數據
文件到/ home/PPS /的NetBeansProjects/UserDirTest:
- /主頁/ PPS /的NetBeansProjects/UserDirTest/F1
- /主頁/ PPS /的NetBeansProjects/UserDirTest/F2

f1和f2出現在同一個目錄中,儘管我更改了user.dir!!!
有人可以幫我嗎?
非常感謝

+0

設置「user.dir」時可能出現[Java:File.exists()不一致)重複](http://stackoverflow.com/questions/2275362/java-file-exists-inconsistencies-when-setting-user- dir) – 2011-02-17 14:35:44

+0

是的,奇怪的事情,我想我必須使用絕對路徑。 – ralfuslongus 2011-02-18 07:51:23

回答

1

我剛剛複製了您的場景。我認爲你的錯誤是你正試圖使用​​系統屬性來改變當前的工作目錄。能夠從系統屬性中檢索這個目錄只是一個方便的方法。如果更改屬性,則目錄本身不會被更改。

解決方案是使用File.mkdir()File.mkdirs()創建您想要的目錄,然後使用new File(myDir, fileName),其中myDir是您的新目錄。

+0

謝謝,我想我必須像這樣使用它。 – ralfuslongus 2011-02-18 07:53:05

0

無法在Java中更改當前目錄。

當您更改系統屬性時,屬性會更改,但不是本機代碼用於創建文件的實際工作目錄。但是,getAbsolutePath使用user.dir系統目錄的當前值組成絕對路徑。