2011-02-17 1 views
1

이 위대한 페이지에서 질문하는 것은 이번이 처음입니다. 실수 할 경우 나에게 인내심을 주시기 바랍니다. 내가 뭘하려고하면 변경 후 내 사용자 디렉토리에 상대 경로로 새 파일을 만드는 것입니다. System.setProperty("user.dir", "/data");을 사용하는 사용자 디렉토리를 변경하려면 File f2 = new File("f2");으로 파일 객체를 만들고 f2.createNewFile();으로 파일 시스템에 빈 파일을 만들었습니다. 이 후 나는/data/f2에 파일이 나타날 것으로 예상했으며, 이것은 f2.getAbsolutePath()이 말해주는 것입니다. 그러나 혼동스럽게도 파일은 "old, initial"userDir에 나타납니다. 내가 얻을,상대 경로에 대한 File.createNewFile()은 "user.dir"을 변경 한 후 잘못된 디렉토리를 사용합니다. - 속성

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()); 
     } 
    } 
} 

이 출력 :

파일/홈/PPS는/NetBeansProjects/UserDirTest에 :
초기 UserDir을 =/가정/PPS/여기

내 테스트입니다 NetBeansProjects/UserDirTest
f1.getAbsolutePath() =/home/pps/NetBeansProjects/UserDirTest/f1
에 대한 getCanonicalPath()입니다. =/홈/PPS/NetBeansProjects/UserDirTest
UserDir을 변경 =/데이터
f2.getAbsolutePath() =/데이터/F2의
getCanonicalPath(). IN/홈 =/데이터
파일/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) –

+0

예, 이상한 일은 절대 경로를 사용해야합니다. – ralfuslongus

답변

1

방금 ​​시나리오를 재현했습니다. 귀하의 실수는 현재 작업 디렉토리를 변경하기 위해 시스템 속성을 사용하려고한다는 것입니다. 시스템 속성에서이 디렉토리를 가져 오는 기능은 편리한 방법 일뿐입니다. 속성을 변경하면 디렉토리 자체가 변경되지 않습니다.

해결책은 File.mkdir() 또는 File.mkdirs()을 사용하여 원하는 디렉토리를 만든 다음 new File(myDir, fileName) (여기서 myDir은 새 디렉토리 임)을 사용하는 것입니다.

+0

고마워, 내가 이걸 이런 식으로 사용해야 해. – ralfuslongus

+0

@alexr 어떤 점에서이 테스트가 지적했듯이, user.dir을 변경하면 일부 내용 만 변경되고 다른 내용은 변경되지 않습니다 (일관성이 없습니다). https : // stackoverflow.COM/질문/45130661/사용자 디렉터리 속성이 깨진-에-OSX-JDK-1-8-0-111-방법에 대한-다른-OS-버전의 링크에 대한 –

0

Java에서 현재 디렉토리를 변경할 수있는 방법이 없습니다.

시스템 속성을 변경하면 속성이 변경되지만 실제 작업 디렉터리는 변경되지 않으므로 네이티브 코드가 파일을 만드는 데 사용됩니다. 그러나 getAbsolutePath는 user.dir 시스템 디렉토리의 현재 값을 사용하여 절대 경로를 작성합니다.

관련 문제